没有用户输入,从串口读取iis不稳定

时间:2011-03-16 08:14:03

标签: delphi serial-port

使用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,它永远不会失败......

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

您的串口设备需要时间来做出反应,因此显然您需要休息时间让设备赶上来。当您使用键盘按下按钮时,您需要提供所需的制动器,因为键盘重复速度并不快。

正如你所说Sleep(2000)应该提供足够的“休息”,但还有两个潜在的问题你需要照顾:

  • 不需要缓冲串行通信:Sleep(2000)可能太长了!
  • 您正在使用的串行库可能正在使用Windows消息来处理传入的字节。 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()可能会有所帮助。