我在我的一个应用程序中使用各种医疗仪器TComPort
并TComDataPacket
与之通信。我有几行代码,TComDataPacket.OnCustomStart
根据TComDataPacket.OnCustomEnd
仪器类型标记数据包的开始和结束。对于具有固定开始和结束字符对(例如STX
/ ETX
)的简单数据包,一切正常。
我尝试使用相同的方法添加对 ASTM 1391 协议的支持。ASTM 1391 数据包由一个ENQ
、一个或多个以 开头STX
和结尾的数据包CR LF
和一个EOT
标记数据传输结束的数据包组成。并且响应ENQ
and CR LF
, andACK
应该被发回。仪器和计算机之间的对话非常简单的示意图如下所示:
- 安装:
ENQ
- 主持人:
ACK
- 安装:
STX
........CR LF
- 主持人:
ACK
- 安装:
STX
...................CR LF
- 主持人:
ACK
- 安装:
STX
..................................................CR LF
- 主持人:
ACK
- 安装:
STX
........CR LF
- 主持人:
ACK
- 安装:
EOT
这是 my OnCustomStart
、OnCustomEnd
和OnPacket
events 中的代码:
procedure TdmInstrument.cdpPacketCustomStart(Sender: TObject; const Str: string;
var Pos: Integer);
begin
if not FInitInfo.IsASTM then // simple packet structure
Pos := System.Pos(FInitInfo.StartChar, Str)
else
begin
Sleep(500); // no idea why this is required
Application.ProcessMessages;
Pos := System.Pos(cENQ, Str);
if Pos = 0 then
begin
Pos := System.Pos(cSTX, Str);
if Pos = 0 then
Pos := System.Pos(cEOT, Str);
end
else
ASTMStr := '';
end;
end;
procedure TdmInstrument.cdpPacketCustomStop(Sender: TObject; const Str: string;
var Pos: Integer);
begin
if not FInitInfo.IsASTM then
Pos := System.Pos(FInitInfo.EndChar, Str)
else
begin
Pos := System.Pos(cENQ, Str);
if Pos = 0 then
begin
Pos := System.Pos(cCR + cLF, Str) + 1;
if Pos = 0 then
Pos := System.Pos(cEOT, Str);
end;
end;
end;
procedure TdmInstrument.cdpPacketPacket(Sender: TObject; const Str: string);
var
i: Integer;
begin
if not FInitInfo.IsASTM then
begin
RawRecord := '';
for i := 1 to Length(Str) do
if Str[i] <> #0 then
RawRecord := RawRecord + Str[i]
else
RawRecord := RawRecord + ' ';
end else begin
ASTMStr := ASTMStr + Str;
if Str <> cEOT then
cpCom.WriteStr(cACK);
if Pos(cENQ, ASTMStr) * Pos(cEOT, ASTMStr) = 0 then // ASTM packet is not yet complete - exit
Exit;
RawRecord := ASTMStr;
end;
// we have a packet, so parse it
ParsePacket;
end;
我的问题是,如果我不Sleep()
使用大于 500 in 的值进行调用,则OnCustomStart
in设置为only。由于我在很多不同的计算机和不同的仪器上都遇到过这个问题,甚至在我的带有环回虚拟串行端口的测试机器上,我的猜测是这与or的内部结构有关。谁能指出我正确的方向?OnPacket
Str
STX
TComPort
TComDataPacket