TMemo.Lines.Add()
は、ラインを追加します。追加するテキストには、行末に改行が挿入されます。ハードウェアデータを分割して受け取っていることは明らかです。メモには、それぞれの行を別々の行として追加しています。あなたがしようとしている何をすべきか
、あなたはどちらかを行う必要があります。
がに、ハードウェアからの作品を読んで、あなたは完全なメッセージの終了を検出するまで、それらをキャッシュし、その後、Add()
唯一の完全なメッセージメモ。これを行う方法は、ハードウェアがデータを送信するために使用している特定のプロトコルに依存します。 STX
/ETX
マーカーにデータをラッピングしますか?それはメッセージを区切りますか?私たちは知らない、あなたはそれに関する情報を提供していない。そして、あなたのコードは、大量のデータを整理しようと試みている(失敗している)のです。
Add()
はまったく使用しないでください。代わりに不要な改行を挿入しないように、SelText
プロパティを使用することができます。
memo1.SelStart := memo1.GetTextLen;
memo1.SelLength := 0;
memo1.SelText := str;
、あなたのタイマーコードはいくつかの奇妙なことをやっている言われていること。 InBuffer
は空白で埋められ、その後、(失敗した)トリムされ、完全に無視されます。初期化されていないk
の値をReadStr()
に渡しています。あなたが読んだstr
の値はメモに追加される前にうまく整えられません。 str
をS
に割り当ててから、S
を無視します。
は、代わりにこれを試してみてください:
procedure TForm3.Timer1Timer(Sender: TObject);
var
str: AnsiString;
begin
if cport.Connected then
begin
ComLed1.Kind := lkGreenLight;
txt_com_status1.Caption := 'Connected';
cport.ReadStr(str, 256);
str := Trim(str);
if str <> '' then
begin
memo1.SelStart := memo1.GetTextLen;
memo1.SelLength := 0;
memo1.SelText := str;
end;
end
else
begin
ComLed1.Kind := lkredLight;
txt_com_status1.Caption := 'Disconnected';
end;
end;
。あるいは(あなたがOnRxChar
イベントがありTComPort
を使用していると仮定します):
procedure TForm3.Timer1Timer(Sender: TObject);
begin
if cport.Connected then
begin
ComLed1.Kind := lkGreenLight;
txt_com_status1.Caption := 'Connected';
end
else
begin
ComLed1.Kind := lkredLight;
txt_com_status1.Caption := 'Disconnected';
end;
end;
procedure TForm3.cportRxChar(Sender: TObject; Count: Integer);
var
str: AnsiString;
begin
cport.ReadStr(str, Count);
str := Trim(str);
if str <> '' then
begin
memo1.SelStart := memo1.GetTextLen;
memo1.SelLength := 0;
memo1.SelText := str;
end;
end;
編集コメントで提供された新しい情報に基づいて、次のように試してみてください:
private
buffer: AnsiString;
portConnected: boolean;
procedure TForm3.Timer1Timer(Sender: TObject);
begin
if cport.Connected then
begin
if not portConnected then
begin
portConnected := true;
buffer := '';
ComLed1.Kind := lkGreenLight;
txt_com_status1.Caption := 'Connected';
end;
end
else
begin
if portConnected then
begin
portConnected := false;
ComLed1.Kind := lkredLight;
txt_com_status1.Caption := 'Disconnected';
end;
end;
end;
procedure TForm3.cportRxChar(Sender: TObject; Count: Integer);
var
str: AnsiString;
i: integer;
begin
cport.ReadStr(str, Count);
buffer := buffer + str;
repeat
i := Pos(#10, buffer);
if i = 0 then Exit;
str := Copy(buffer, 1, i-1);
Delete(buffer, 1, i);
memo1.Lines.Add(str);
until buffer = '';
end;
インデントを使用した場合、コードを読みやすくなります。 –
文字列からCR(#13)とLF(#10)を削除します。また、装置が文字列の送信を完了したことを知らなければならないので、タイミングの問題もあります。 –
side note:hwからのパケットにSOPとEOPがある場合は、フラグメント化されたパケットの処理を避けるためにデータをバッファし、S/EOPを使用して抽出し、フォーマットしてください。 – ComputerSaysNo