首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >德尔菲7 TComPort OnRxChar not失火

德尔菲7 TComPort OnRxChar not失火
EN

Stack Overflow用户
提问于 2016-03-10 11:20:09
回答 1查看 1.4K关注 0票数 3

我使用TComPort,我使用OnRxChar事件来控制字节到达的时间。

我为我发送的每个命令接收3个字节的字,但有时,OnRxChar只接收2个字节--剩余的字节没有接收到,即使在同一时间正确地发送了3个字节。

我认为剩余的字节仍然在一些缓冲区中,但是OnRxChar没有为最后一个字节触发,为什么?

我做错了什么?

编辑1

一段代码

代码语言:javascript
复制
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

代码语言:javascript
复制
procedure BraccioRobot.Log;
begin
  Memo1.Lines.Add(FMsg);
end;

我删除了同步调用,现在调用该事件。我做测试的时候需要一些东西来记录。怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-10 17:54:06

据我所知,TComPort.OnRxChar事件是在主线程中执行的。在此事件处理程序中调用Synchronize(Log)。这很糟糕。请参见TThread.Synchronize,其中说明如下:

警告:不从主线程内调用同步。这会导致无限循环。

这也可以解释为什么你错过了一个事件电话。TComPort.OnRxChar事件已经用Synchronize()语句调用,添加另一个Synchronize(Log)调用会导致来自系统的消息丢失。

只需在没有Synchronize的情况下调用Synchronize就可以了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35914981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档