Delphi 7 TComPort OnRxChar 未触发

Delphi 7 TComPort OnRxChar not fire

我正在使用 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 的说明:

Warning: Do not call Synchronize from within the main thread. This can cause an infinite loop.

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

只需调用 Log 而不使用 Synchronize 即可。