解決済みの質問
質問:No.5389831
困ってます
お気に入り投稿に追加する (0人が追加しました)
回答数4
閲覧数853
シリアル通信のデータ欠けについて
シリアル通信のデータ欠けについて教えてください。

WindowsXP上でシリアル通信「115200bps、8、None(ODD、EVEN)、1」の設定で、1ms毎に12バイトの送受信を行っているのですが、1分ほど受信すると、データ欠けが発生します。

受信プログラムはこの問題が発覚してから、受信したデータを変数にバッファリングし、保存ボタンを押してから、ログファイルへ保存するシンプルなプログラムを作成し、確認しています。

「切り分けた内容」
1、57600bpsでも発生する
2、VB6、VisualStudio2008 C#で作成したツール及びフリーソフト(SerialDebugger)でも、データ欠けが発生する
3、RS232Cラインモニタ(キャロちゃん)で確認すると、データ欠けは発生していないので、受信側の問題と判断しています。
4、送信間隔を50msと遅くしても発生する
5、RS232C及び、USB変換したものどちらでも発生する
6、9600bpsでは、発生しない(同じデータ数での判断)
7、ケーブル長は1mほど

ちなみに通信時間に余裕が無い為、チェックサムやハンドシェイクなどの機能は、入れられません。

一般的にWindowsでシリアルの高速受信を行うと、データ欠けが発生するのが当たり前なのでしょうか?
投稿日時 - 2009-10-23 11:40:29
質問者が選んだベストアンサー
回答:No.2
>VC++6.0では、文字抜けは無いとのことですが、通信速度はいくらだったで
>しょうか?

 はっきり記憶にあるのは19200bps,100ms間隔で数10バイト受信です。
 受信スレッドを起動した場合38400までは実験したように記憶があります。
 115200bpsならCOMタイムアウトの設定もそれなりの値を設定してやる
必要が有るかと思います。
//------------- タイムアウト値設定 100ms 間隔
::GetCommTimeouts(hSerialPort, &CommTimeouts);

// 受信文字間タイムアウト[ms]
CommTimeouts.ReadIntervalTimeout= 20;大きすぎ以下同じ
// 受信文字数比例タイムアウト [ms] * 文字数
CommTimeouts.ReadTotalTimeoutMultiplier= 5;
// 受信基底タイムアウト値
CommTimeouts.ReadTotalTimeoutConstant= 20;

// 送信文字数比例タイムアウト値[ms] * 文字数
CommTimeouts.WriteTotalTimeoutMultiplier= 2;
// 送信基底タイムアウト値[ms]
CommTimeouts.WriteTotalTimeoutConstant= 50;大きすぎ
::SetCommTimeouts(hSerialPort, &CommTimeouts);

 後、115200bps,1ms間隔,12バイトだと1msを超えるので、
10ms間隔ぐらいでないとうまくいかないと思います。
 それか送受信フロー制御で送信側を待たせるかです。
投稿日時 - 2009-10-26 15:13:27
この回答を支持する
(現在0人が支持しています)
お礼
何度もご回答ありがとうございます。
また、サンプルまで紹介頂き、ありがとうございます。

> 後、115200bps,1ms間隔,12バイトだと1msを超えるので、
>10ms間隔ぐらいでないとうまくいかないと思います。
上記の件ですが、
12バイト = 8bit * 12 = 96bit
1秒間送信データ数 = 96bit * 1000ms = 96000bps
で、間に合うのでは無いのでしょうか?

送受信フロー制御については、検討してみます。
アドバイスありがとうございます。
投稿日時 - 2009-10-27 11:04:12
この質問は役に立ちましたか?
2人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答
回答:No.4
>12バイト = 8bit * 12 = 96bit

 シリアルインタフェース(RS-232-C)では、スタートビット
ストップビットが付加されて1バイト10bitになります。
 さらにパリティを有効にすると11 bitになってしまいます。
投稿日時 - 2009-10-27 15:11:34
この回答を支持する
(現在0人が支持しています)
お礼
ご回答ありがとうございます。

確かに仰るとおりですね。
完全に抜けていました。

その後の仕様の変更で、10バイトですみそうです。
ただ10バイトでも、事象は同じなんですよね~。
投稿日時 - 2009-10-27 15:44:29
回答:No.3
 1分間は文字抜けしないなら、取り出すアプリ側で工夫すれば
10~50ms間隔なら文字抜けしないようにする事は出来るんではな
いかと思います。
 受信イベントを通知されたら ClearCommError()でCOMSTATを
取出し cbInQue の値だけCOMポートから取出してバッファに格納
すれば、取出しは間に合うんではないかと思います。
 回答2の追補です。
投稿日時 - 2009-10-26 17:19:51
この回答を支持する
(現在0人が支持しています)
お礼
アドバイスありがとうございます。

こちらも、参考にさせて頂きます。
投稿日時 - 2009-10-27 11:07:18
回答:No.1
>一般的にWindowsでシリアルの高速受信を行うと、データ欠けが発生
>するのが当たり前なのでしょうか?

そんな事は有りません、VC++6.0で受信スレッドを起動した場合
文字抜けは経験しませんでした。
 VBでスレッドが起こせるのか知りませんが受信スレッドを使えば
解決すると思います。
投稿日時 - 2009-10-23 11:52:40
この回答を支持する
(現在0人が支持しています)
お礼
ご回答ありがとうございます。
VC++6.0では、文字抜けは無いとのことですが、通信速度はいくらだったでしょうか?

VB6でも9600bpsでは、データ欠けは発生しませんでした。

VB6では、スレッドの作成はできませんが、受信イベントが発生します。データの送信間隔を遅らせても発生しますので、処理速度が間に合わなくて、発生してるわけでもなさそうなんですよね。

他にC#でも発生していますので、VB6だけの問題だとも考にくいのですが、他に情報はお持ちでは無いでしょうか?
投稿日時 - 2009-10-26 09:44:49
もっと聞いてみる
関連するQ&Aはこちら
ダブルバッファリングを使ったつもりですが、キー操作するたびに画面がチカチカします。 特に <applet code="test.class" width="1600" height="600"> ...
仲間はずれはどれか、という問題がありましたが、Dでないことは確かですが、ずっと考えてもわかりませんでした。ヒントか手がかりをいただけませんか?よろしくお願いします。 -----------------...
class Odd{ public static void main(String argv[]){ int num[] = {2,3,4,8,4,2,6,9,12,20}; <空欄(複数行)> } ...
この他の関連するQ&Aをキーワードで探す
[技術者向] コンピューターのサブカテゴリ
RSS
PR
-PR-