掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
シリアル通信で区切り子を待つには? (ID:40093)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
提示したのは、受信待ちループの箇所でした。 受信イベント処理は次の様にしています。 str := MSComm1.Input;もここにあります。 whileループだけの時は、ハードウェアが受信してもここへ飛ばなかったと思われます。"Application.ProcessMessages"の追加で飛ぶ様になった様です。 ここのソースはほぼ変更していません。 procedure TForm1.MSComm1Comm(Sender: TObject); var buf : variant; n, l, m : Integer; i, j : Integer; ptr : PChar; str : String; begin case MSComm1.commEvent of comEvReceive: begin n := MSComm1.InBufferCount; if n > 0 then begin m := MSComm1.InputMode; str := MSComm1.Input; rev_buf.buf[ rev_buf.pre ] := str[1]; inc( rev_buf.pre ); if ( rev_buf.pre > 1024 ) then begin rev_buf.pre := 1; if ( rev_buf.pre = rev_buf.post ) then ShowMessage( 'Buffer Overflow!!' ); end; ptr := PChar( str ); l := Length( ptr ); if ( rev_buf.buf[ rev_buf.pre - 1 ] = Char(10)) then if ( rev_buf.buf[ rev_buf.pre - 2 ] = Char(13)) then inc( i_CRLF ); rev_buffer := rev_buffer + str; Memo1.Lines.Text := Memo1.Lines.Text + strPas( @rev_buf.buf[ rev_buf.post ]); StatusBar1.Panels[3].Text := IntToStr( rev_buf.pre - rev_buf.post ); end; end; // of comEvReceive end; // of case end; どんな感じでしょうか? 無駄な事をやっているかもしれません。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.