gpt4 book ai didi

delphi - 如果没有用户输入,从串行端口 iis 读取数据不稳定

转载 作者:行者123 更新时间:2023-12-03 18:19:41 24 4
gpt4 key购买 nike

我使用 Delphi 7 从串行端口读取数据。

读取之前总是先进行写入,该写入会触发硬件从传感器进行测量并写入一些内容供我读取(并且总是有一些内容可以读取)。

我有两种可能性:手动输入命令并单击按钮将其写入串行端口(读取型号或固件版本等)或单击按钮循环读取测量值,直到按下停止按钮。它们都使用相同的内部函数,因此代码如下所示:

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 dial...', mtInfo, [mrOK]); 到循环中,则不再失败。

现在,它看起来不像计时(否则肯定会在循环中添加 Sleep(2000); 会让它通过,但不会,所以为什么按主窗体或模式对话框上的按钮会导致其成功吗?

顺便说一句,硬件用户指南没有提及 CTS/RTS,并且提供的唯一代码示例也没有提及。

注意:如果我重复手动输入?data,它永远不会失败......

有什么想法吗?

最佳答案

您的串行设备需要时间使用react,因此显然您需要休息一下以便设备跟上。当您使用键盘按下按钮时,您正在提供所需的制动,因为键盘重复速度不是那么快。

正如您所说,Sleep(2000) 应该提供大量的“休息”,但是您还需要注意其他两个潜在问题:

  • 串行通信不需要缓冲:Sleep(2000) 可能太长!
  • 您正在使用的串行库可能使用 Windows 消息来处理传入字节。 Sleep() 抑制消息泵,因此不再有消息流向您的应用程序

尝试使用如下方式“ 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;

这个例程会等待,但它会让消息泵继续运行,允许您的串行库接收消息。如果这就是问题所在...

关于delphi - 如果没有用户输入,从串行端口 iis 读取数据不稳定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5322540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com