我正在使用 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/