我正在使用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的调用,现在调用了该事件。 在进行测试时,我需要一些东西来制作日志。 怎么办?
答案 0 :(得分:3)
据我所知,TComPort.OnRxChar
事件在主线程中执行。您在此事件处理程序中调用Synchronize(Log)
。这是不好的。请参阅TThread.Synchronize所述内容:
警告:不要在主线程中调用Synchronize。这可能导致无限循环。
这也可以解释为什么你错过了一个事件调用。已使用TComPort.OnRxChar
语句调用Synchronize()
事件,并且添加另一个Synchronize(Log)
调用可能导致系统中的消息丢失。
只需在没有Log
的情况下致电Synchronize
即可。