Delphi 7 TComPort OnRxChar没有火

时间:2016-03-10 11:20:10

标签: delphi tcomport

我正在使用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的调用,现在调用了该事件。 在进行测试时,我需要一些东西来制作日志。 怎么办?

1 个答案:

答案 0 :(得分:3)

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

  

警告:不要在主线程中调用Synchronize。这可能导致无限循环。

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

只需在没有Log的情况下致电Synchronize即可。