我正在使用 TComPort我使用 OnRxChar 事件来控制字节到达的时间。

对于我发送的每个命令,我收到 3 个字节的字,但有时,OnRxChar 只收到 2 个字节,没有收到剩余的字节,即使当时正确发送了 3 个字节。

我认为剩余的字节仍在某些缓冲区中,但是 OnRxChar 不会为最后一个字节触发,为什么?

我究竟做错了什么?

编辑 1

一段代码

procedure BraccioRobot.ComPort3RxChar(Sender: TObject; Count: Integer);
var
  i:integer;
  BB : integer;
  Dist:double;
  Buff:array [0..10] of byte;
begin
FMsg:='Byte in:'+IntToStr(Count);
Synchronize(Log);
ComPort3.Read(Buff, Count);

for i:=0 to Count-1 do begin
  Rxbuff[CountRx+i]:=Buff[i];
end;
CountRx:=CountRx+Count;

if CountRx<3 then begin
  exit;
end;


// --------------------------
// 80 lines of code where I process the received data

编辑 2
如果仅收到 2 个字节后,我发送其他 3 个字节,OnRxChar 触发,这次我收到 4 个字节,第一个字的最后一个字和整个第二个字

像这样:
A1 A2 | A3 B1 B2 B3
编辑 3
procedure BraccioRobot.Log;
begin
  Memo1.Lines.Add(FMsg);
end;

我删除了对 Synchronize 的调用,现在调用了该事件。
当我做测试时,我需要一些东西来制作日志。
怎么办?

最佳答案

据我所知,TComPort.OnRxChar 事件在主线程中执行。您正在此事件处理程序中调用 Synchronize(Log)。这不好。请参阅 TThread.Synchronize ,其中说明:



这也可以解释为什么您错过了事件调用。 TComPort.OnRxChar 事件已经使用 Synchronize() 语句调用,添加另一个 Synchronize(Log) 调用可能会导致来自系统的消息丢失。

只需在没有 Log 的情况下调用 Synchronize 就可以了。

关于Delphi 7 TComPort OnRxChar 不触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35914981/

10-14 07:31