掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
シリアル通信で区切り子を待つには? (ID:40091)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
うぇいく さん、TSさん、KHE00221さん ありがとうございます。 元々、MSCommはMSVB用に用意されたものと理解しています。 VB系の情報をみたところ、RS232Cで区切り子を待つ例がみつかりました。 "DoEvent"と言うコマンド?でイベント待ちを開放するとありました。 DELPHIで調べたところ、"Application.ProcessMessages"がそれに該当する事が分かりました。TSさんに案内頂けた内容とほぼ同じでした。 つまり、明確に謳われている分けではありませんが、ループ内ではイベントは受け付けられないと言う事と同じ意味ではないでしょうか? とりあえず、タイマーイベントは止めにして、タイムアウトループ内で"Application.ProcessMessages"によりイベント開放してみたところ、区切り子の受信によりループ脱出する様になりました。 未だ、受信内容(送信コマンドの応答)により、タイムアップしてしまう例があり、完全には動作していない様ですが、とりあえず、問題は解決致しました。 大変ありがとうございました。 ソースは次の様にしました。 MSCommの設定は最初のままです。 おかしなところはあるでしょうか? function TForm1.SendRecieveCmd( cmd0 : String; timer : DWord ) : String; var i, j : DWord; n : Integer; buf : Array[ 1 .. 1024 ] of Char; str : String; begin str := ''; n := 1; MSComm1.Output := cmd0 + Char(13) + Char(10); for j := 1 to $FF do begin i := timer; while i > 0 do begin StatusBar1.Panels[2].Text := IntToStr( i_CRLF ); if i_CRLF > 0 then begin while rev_buf.pre <> rev_buf.post do begin buf[ n ] := rev_buf.buf[ rev_buf.post ]; inc( n ); inc( rev_buf.post ); if rev_buf.post > 1024 then rev_buf.post := 1; end; buf[ n - 2 ] := Char(0); str := StrPas( @buf[1] ); dec( i_CRLF ); break; end; Application.ProcessMessages; end; if str <> '' then break; end; result := str ; end; rev_buf.pre と rev_buf.post はリングバッファの受信文字列の先頭と後尾の位置です i_CRLFが区切り子のフラッグ(カウンタ)です。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.