首页 > 解决方案 > 在 Delphi Berlin 10.1 上使用 CPort Lib 接收数据包时的拆分响应

问题描述

我有一个连接到 USB 端口的设备,当我发送请求时,我收到了响应。但是我收到了一个拆分响应,看起来 CPort 没有等待整个响应。

Sent: getNodeStatus,03
(HEX) > A5 FE 03 10 00 10 19 17 00 1A 17 16 17 10 19 00 19 19 19 00 10 19 10 10 10 00 19 00 10 10 00 19      
(HEX) > 17 19 00 00 10 10 10 10 18 10 10 19 19 10 10 00 00 00 00 00 00 6D 

我想将两条线合并为一条并具有相同的响应:

Sent: getNodeStatus,03
(HEX) > A5 FE 03 10 00 10 19 17 00 1A 17 16 17 10 19 00 19 19 19 00 10 19 10 10 10 00 19 00 10 10 00 19 17 19 00 00 10 10 10 10 18 10 10 19 19 10 10 00 00 00 00 00 00 6D 

我不知道如何实现,这是OnPacket代码:

procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: string);
var
  I:Integer;
  t:byte;
  str2:String;
begin
    for I:=1 to length(str) do
      begin
        str2 := str2+IntToHex(Byte(str[I]),2)+' ';
      end;
    memo1.lines.add('(HEX) > '+str2);
    memo1.lines.add(' ');
end;

要记住的一件重要事情是,不可能使用 的StartString & StotString属性,ComDataPacket因为它随时更改。还有什么想法吗?

额外信息:

当我使用另一个给我最短响应的请求时,它不会分裂

Sent: getId,03
(HEX) > A5 81 52 CS

标签: delphiserial-portusbpacketdelphi-10.1-berlin

解决方案


CPort 不等待整个响应。

这是任何串行端口(包括 USB 端口)上的预期行为。您将不得不手动合并数据。

请注意,当通过 USB 传输数据时,数据很可能已经拆分 - CPort 通常非常紧密地遵循 USB 事务。

如果您的协议不允许确定消息结束,例如,您将不得不使用超时。


推荐阅读