- PR -

【.NET2003C#】シリアル通信受信バイト数について

1
投稿者投稿内容
ぶっさん
会議室デビュー日: 2007/03/26
投稿数: 3
投稿日時: 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);
}
}

何が悪いか解らず、どなたかご教示頂ければ幸いです。
未記入
大ベテラン
会議室デビュー日: 2006/12/15
投稿数: 157
投稿日時: 2007-03-26 16:07
MSCommは使ったこと無いですが・・・
MSComm コントロールを使用してデータの送受信を行う方法

下のほうに「Input プロパティを使用して受信します。取得したデータはバッファから削除されます。」て書いてある通り、読み込んだ後にバッファ長が0になってループ抜けてるのでは?
rvmx
大ベテラン
会議室デビュー日: 2002/09/26
投稿数: 184
お住まい・勤務地: 愛媛県
投稿日時: 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
投稿数: 3
投稿日時: 2007-03-26 17:51
未記入さん、rvmxさん、ご教示ありがとうございます。
Threadを使用して
while(axMSComm1.InBufferCount > 0)
{
Thread.Sleep(100);
OnCommReceive((byte[]) axMSComm1.Input);
}
とすると、解決しました。100は適当な数値ですが。
38400bpsとはいえ、全dataが入りきる前にInputしていたようです。
ありがとうございました!
rvmx
大ベテラン
会議室デビュー日: 2002/09/26
投稿数: 184
お住まい・勤務地: 愛媛県
投稿日時: 2007-03-26 19:37
今日は

ご参考に
もし、データがバッファサイズ1024バイト一杯を使っていると100msでは足りないみたいですよ。
1024×8/38.4=214msと成ります。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-03-26 19:43
Sleepで待つのはどちらかと言うと、邪道ですよ。

OnCommイベントが発生するたびにaxMSComm1.Input呼出してデータを取り出し、直前までに取得しているデータと結合します。このデータが予定した受信サイズになったら、初めて受信処理を行います。そうしないとDelayの多い、遅い通信プログラムになってしまいます。
ぶっさん
会議室デビュー日: 2007/03/26
投稿数: 3
投稿日時: 2007-03-26 20:46
rvmxさん、甕星さん、ご指摘ありがとうございます。
確かにSleepで待つと、無駄の多いプログラムになりますね。

甕星さんの御意見通り、予定受信サイズになってから受信処理を
行うように変更しました。ありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)