2013-04-03 144 views
-2

有没有办法在程序集中暂停1秒钟,然后让它恢复正常流程?我通过串口编程聊天,但由于某种原因,当我在其中一个程序上键入字符串时,另一个程序并不总是以单个字符串的形式接收它;有时会将其打印为一个整体,但有时只显示一个部分,并立即意识到有更多字符串可以接收并将其打印为第二个字符串。我试图做的是停止一秒钟左右的程序,所以它可以确保它收到整个字符串,而不仅仅是它的一部分。暂停组装程序

+0

如果你做得对,你应该得到一个只有当你收到某种“消息结束”字节(例如换行符)时才会显示的字节流,并且你不应该有任何需要一开始就停下来。您的1秒暂停不能解决问题。 – Brendan 2013-04-04 01:39:34

+3

请指定CPU和操作系统。答案将取决于那些。事实上,请为所有[议会]问题做同样的事情。 – 2013-04-04 02:24:42

+1

修复您的聊天协议会不会更容易,以便字符串的开始/结束可以在接收为字节流时被识别?定时器机箱不能可靠工作,或引入令人讨厌的延迟,或两者兼而有之。 – 2013-04-05 12:41:56

回答

2

对于80x86;如果操作系统类似MS-DOS或“无”,那么在执行HLT(节省电量)时,您需要在循环中轮询BIOS的“自午夜以来的刻度”。要获得“自午夜以来的滴答声”,请使用int 0x1Aah=0x00。一秒钟将是大约18个滴答声。如果你不小心,在午夜之前做“expiry_time = now + 1秒”,那么你可能会永远等待,你应该做if(expiry_time >= 0x001800B0) expiry_time -= 0x001800B0以防止这种情况发生。如果操作系统是现代的(Windows,OS X,Linux,FreeBSD等),那么你想告诉操作系统的调度程序在1秒钟内运行其他任务(以避免无故中断CPU时间);你要么找到合适的(特定于操作系统的)API来做到这一点,要么找到某种类型的库来链接它,这样做对你来说很重要。

+0

+1(我曾经使用这种技术为80386制作了红外发射器。)微秒的分辨率间隔不必担心溢出。 – 2013-04-04 03:30:36

+0

我试过这个等待1个滴答声(aprox 55ms),它工作得很好,我的任何字符串都没有被再次接收 – user2221424 2013-04-04 05:35:22

0

是,

使用GOTO和NOPS。

或者创建一个循环来隐藏nops,并在满足某些条件时逃脱它。 或创建一个GOTO标签的NOP

startover 
nop 
nop 
nop 
nop 
nop 
nop 
nop 
nop 
GOTO startover // this wil run forever! you need an escape condition 
+0

是甚至组装?我从未在 – user2221424 2013-04-04 01:22:13

+1

之前看过这些命令。每个CPU至少有一种汇编语言(并且通常CPU有2种或更多种不同的汇编语言,例如Intel语法与AT&T)。因为这个问题并没有说哪个CPU使用哪种汇编语言,“伪汇编”是个好主意。 'GOTO'不是程序集,但'GOTO'以多种语言存在,并且被广泛理解,这使得它成为“伪组装”的有吸引力的选项。 – Brendan 2013-04-04 01:34:49

+0

我不明白的是nop,我想它除了浪费时间外并没有真正做任何事情。 – user2221424 2013-04-04 05:34:39

0

是的,你可以得到系统时钟,然后做一个循环来检查,如果第二个已通过你有时间之后的bunchs ...

这可能会帮助,如果你在x86汇编:https://softwareengineering.stackexchange.com/questions/134084/assembly-instructions-execution-time

或者你可以做一个很长的循环,使暂停......第二个我不建议多,但它可能会满足您的需求

+0

我正在使用x68,我会尝试一下,非常感谢 – user2221424 2013-04-04 01:22:53

2

我不回答这个问题本身,但无论如何:

从不(我的意思是NEVER!)使用时间延迟这样的目标!这是非常非常非常糟糕的设计。串口通信基于字符流。正确设计的程序(不管使用什么语言)必须处理流,而不需要任何时间延迟。

-1

你可以选择你想要什么

.code 
;write your code 
call Waitmsg 
+0

错误的问题。这是关于睡眠/等待一段固定的时间,而不是用户输入。你已经在http://stackoverflow.com/questions/23249397/assembly-console-pause上发布了这个确切答案的另一个副本,它属于哪里(虽然如果你链接到一些关于该功能的文档会好很多是/一样)。 – 2016-10-23 21:39:05

0

似乎从缓冲问题就来写这个声明.CODE段后显示。等待可能很好,但是你必须回答“多少次?”的主要问题。事实上,你并不知道。 在ASM中,我们使用中断或等待“直到标志被设置”。但只有“等待一定秒数”似乎不是正确的选择(我同意johnfound 100%!)

建议:在发件人程序中,缓冲数据,直到CR/LF发送它们。在接收器上,等待显示CR/LF。 也看看串行缓冲区指针(IN和OUT)来查看开始和结束指针的位置,这可能会给出一些信息来解释发生了什么。