ここに未解決の質問がいくつかありますので、間違っているかもしれないいくつかの仮定を立てる必要がありますが、見てみましょう.
どの通信ポート ライブラリを使用しているかわかりませんので、SourceForge の CPort ライブラリだと思います。私はそれを自分で使用したことはありませんが、送信前にライブラリによって ansistring に変換される unicodestring パラメータを使用して書き込みメソッドを呼び出すことができるように、Unicode 対応になっていることを読みました。同様に、外部から ansistring を受け取ると、ライブラリは Read メソッドの unicodestring に変換します。
シリアル通信の非同期性のため、書き込みメソッドを使用して何かを送信すると、ライブラリと OS がボーレートで定義されたペースで一度に 1 つずつ文字を吐き出す間、メソッドはすぐに戻ることを理解することが重要です。その結果、外部デバイスが最初の文字を受信する前に通信ポートから読み取ろうとしていたため、最初のコードは何も受信しませんでした。OnRxChar (おそらくライブラリ イベント) のイベント ハンドラーを実装することで、成功への第一歩を踏み出したことがわかりました。
OnRxChar は、おそらく各文字 (または数文字) に対して起動します。これらのイベント間で永続的なバッファーが必要です。イベント ハンドラのローカル変数 (現在スタックに割り当てられているもの) は永続的ではなく、イベント ハンドラが終了するたびに失われます。Buffer 変数を TReaderProgrammer のフィールドとして宣言する必要があります。バッファを AnsiString に定義した理由はわかりませんが、文字列で試してみることをお勧めします (Unicode 認識に関する上記の説明を参照)。
type
TReaderProgrammer = class
..
RxBuffer: string;
..
end;
コマンドへの応答として新しいデータを受信できるようにするには、外部デバイスに新しいコマンドを送信するときにバッファをクリアする必要があります。
編集:または、完全な応答を受信して処理したときにすぐに RxBuffer をクリアすることもできます。
TReaderProgrammer.ComPort1RxChar は次のソファのようになります。
procedure TReaderProgrammer.ComPort1RxChar(Sender: TObject; Count: Integer);
var
RxData : string;
begin
(Sender as TComPort).ReadStr(RxData,Count);
RxBuffer := RxBuffer + Rxdata;
...
end;
イベントハンドラーの残りの部分は、おそらく受信の進行状況を確認するためのものなので、それ以上のことはありません。