我使用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 fire和我这次增加了4个字节,第一个单词的最后一个和整个第二个单词
像这样:A1 A2 | A3 B1 B2 B3
编辑3
procedure BraccioRobot.Log;
begin
Memo1.Lines.Add(FMsg);
end;我删除了同步调用,现在调用该事件。我做测试的时候需要一些东西来记录。怎么做?
发布于 2016-03-10 17:54:06
据我所知,TComPort.OnRxChar事件是在主线程中执行的。在此事件处理程序中调用Synchronize(Log)。这很糟糕。请参见TThread.Synchronize,其中说明如下:
警告:不从主线程内调用同步。这会导致无限循环。
这也可以解释为什么你错过了一个事件电话。TComPort.OnRxChar事件已经用Synchronize()语句调用,添加另一个Synchronize(Log)调用会导致来自系统的消息丢失。
只需在没有Synchronize的情况下调用Synchronize就可以了。
https://stackoverflow.com/questions/35914981
复制相似问题