使用Delphi 7我正在从串口读取。
读取总是在写入之前触发h / w从传感器测量并写一些东西供我阅读(并且总是有东西要读)。
我有两种可能性:手动输入命令并单击按钮将其写入串口(读取模型或f / w版本等)或单击按钮循环读取测量值直到按下停止按钮。这两个都使用相同的内部函数,因此代码如下所示:
WriteSerial('?model');
SerialData := ReadSerial(); // returns string
WriteSerial('?fw');
SerialData := ReadSerial();
和
while stopButtonNotPressed do
begin
WriteSerial('?data');
SerialData := ReadSerial();
Memo1.Lines.Add(SerialData );
end;
第一种变体(手动输入命令和按下按钮)总是成功,无论我输入命令的速度有多快或多慢(按住按钮重复),第二种变体
pass
fail
pass
pass
fail
pass
pass
fail
... add infinitum
添加对sleep的调用什么都不产生,但是试图调试,我发现如果我在循环中添加一个模态对话框MsgDialog, 'Please close this dialog...', mtInfo, [mrOK]);
,那么它就不再失败了。
现在,它不像时间一样看起来(否则肯定会在循环中添加Sleep(2000);
会使它通过&不会,所以为什么按主窗体上的按钮或模态对话框使它成功?
顺便说一句,h / w用户指南中没有提到CTS / RTS,唯一提供的代码示例也没有。
注意:如果我反复手动输入?data
,它永远不会失败......
有什么想法吗?
答案 0 :(得分:5)
您的串口设备需要时间来做出反应,因此显然您需要休息时间让设备赶上来。当您使用键盘按下按钮时,您需要提供所需的制动器,因为键盘重复速度并不快。
正如你所说Sleep(2000)
应该提供足够的“休息”,但还有两个潜在的问题你需要照顾:
Sleep()
禁止消息泵,因此没有更多的消息流动你的应用程序尝试使用以下内容“休眠”:
procedure BusyWait(ms: Cardinal);
var StopAt: TDateTime;
begin
StopAt := Now + EncodeTime(0, 0, ms div 1000, ms mod 1000);
while StopAt > Now do
begin
Application.ProcessMessages;
Sleep(50); // per Michał Niklas's suggestion, to keep the CPU from reaching 100%
end;
end;
此例程将等待,但它将保持消息泵的运行,允许您的串行库接收消息。如果这是问题......
答案 1 :(得分:1)
在Application.ProcessMessages()
之前添加Sleep()
可能会有所帮助。