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
即可。
我正在使用 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
即可。