笔记。
大多数通信端口组件都不知道何时向所有者报告。通常,负责从端口收集字节的线程会被操作系统通知一个或多个字节已准备好进行处理。然后,此信息会简单地弹出到您的级别。因此,当您期望消息被传输时,您会得到操作系统给您的信息。
您必须在全局缓冲区中缓冲所有传入的字符。当您获得消息字符串中的最后一个字符时,处理该消息。
下面是一个示例,其中消息开头用特殊字符标识,消息结尾用另一个字符标识。
如果您的消息是以另一种方式构建的,我相信您可以弄清楚如何调整代码。
var
finalBuf: AnsiString;
{- Checking message }
Function ParseAndCheckMessage(const parseS: AnsiString) : Integer;
begin
Result := 0; // Assume ok
{- Make tests to confirm a valid message }
...
end;
procedure TMainForm.ComPortRxChar(Sender: TObject; Count: Integer);
var
i,err: Integer;
strBuf: AnsiString;
begin
ComPort.ReadStr(strBuf, Count);
for i := 1 to Length(strBuf) do
case strBuf[i] of
'$' :
finalBuf := '$'; // Start of package
#10 :
begin
if (finalBuf <> '') and (finalBuf[1] = '$') then // Simple validate check
begin
SetLength( finalBuf, Length(finalBuf) - 1); // Strips CR
err := ParseAndCheckMessage(finalBuf);
if (err = 0) then
{- Handle validated string }
else
{- Handle error }
end;
finalBuf := '';
end;
else
finalBuf := finalBuf + strBuf[i];
end;
end;