ノート。
ほとんどのcom-portコンポーネントには、所有者にいつ報告するかについての手がかりがありません。通常、ポートからバイトを収集する責任があるスレッドは、1つ以上のバイトを処理する準備ができていることをOSから通知されます。この情報は、単にあなたのレベルにポップアップされます。したがって、メッセージが転送されることを期待すると、OSが提供するものを取得できます。
すべての着信文字をグローバルバッファにバッファリングする必要があります。メッセージ文字列の最後の文字を取得したら、メッセージを処理します。
これは、メッセージの開始が特殊文字で識別され、メッセージの終了が別の文字で識別される例です。
メッセージが別の方法で作成されている場合は、コードを適応させる方法を理解できると確信しています。
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;