- - PR -
【.NET2003C#】シリアル通信受信バイト数について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-03-26 11:26
超初心者で失礼します。
MSCommを利用して、外部機器とUART通信(38400bps)のプログラムを作成中です。 PCからの送信には問題ないのですが、外部機器からの受信が8byteで切れてしまいます。 受信バイト数も1024byteに設定しており、また外部機器からのデータはラインモニタで 確認しているので間違いないと思います。 private void MSComm1_OnComm(object sender, System.EventArgs e) { while(MSComm1.InBufferCount > 0) { OnCommReceive((byte[]) MSComm1.Input); } } 何が悪いか解らず、どなたかご教示頂ければ幸いです。 |
|
投稿日時: 2007-03-26 16:07
MSCommは使ったこと無いですが・・・
MSComm コントロールを使用してデータの送受信を行う方法 下のほうに「Input プロパティを使用して受信します。取得したデータはバッファから削除されます。」て書いてある通り、読み込んだ後にバッファ長が0になってループ抜けてるのでは? |
|
投稿日時: 2007-03-26 16:42
今日は
VB6.0でMSCommを使った時ですが、OnCommにはデータ受信以外のイベントでも入ってきます。 データはMSComm1.CommEvent==2の時だったと思います。 又、MSComm1.RThreshold = 1に設定すると1文字単位と成りますが、その時は 未記入さんが言われている様に、InBufferCountが0でも待機する必要が有ります(相手はシリアル通信ですから、通信速度によりますが遅れて来ます)。 C#での情報で無いので、間違っていたら無視してください。 [ メッセージ編集済み 編集者: rvmx 編集日時 2007-03-26 17:32 ] |
|
投稿日時: 2007-03-26 17:51
未記入さん、rvmxさん、ご教示ありがとうございます。
Threadを使用して while(axMSComm1.InBufferCount > 0) { Thread.Sleep(100); OnCommReceive((byte[]) axMSComm1.Input); } とすると、解決しました。100は適当な数値ですが。 38400bpsとはいえ、全dataが入りきる前にInputしていたようです。 ありがとうございました! |
|
投稿日時: 2007-03-26 19:37
今日は
ご参考に もし、データがバッファサイズ1024バイト一杯を使っていると100msでは足りないみたいですよ。 1024×8/38.4=214msと成ります。 |
|
投稿日時: 2007-03-26 19:43
Sleepで待つのはどちらかと言うと、邪道ですよ。
OnCommイベントが発生するたびにaxMSComm1.Input呼出してデータを取り出し、直前までに取得しているデータと結合します。このデータが予定した受信サイズになったら、初めて受信処理を行います。そうしないとDelayの多い、遅い通信プログラムになってしまいます。 |
|
投稿日時: 2007-03-26 20:46
rvmxさん、甕星さん、ご指摘ありがとうございます。
確かにSleepで待つと、無駄の多いプログラムになりますね。 甕星さんの御意見通り、予定受信サイズになってから受信処理を 行うように変更しました。ありがとうございます。 |
1