VBのMSCommにてシリアル通信アプリを作成しました。
デスクトップPC(Win2000)では正常に動作するにも関わらず、
ノートPC(WinMe)ではデータ受信時にとりこぼしが発生する様です。
とりあえず、MSCommのOnCommイベントプロシージャ内でCommEventプロパティにて
エラーコードを引っ掛けると、1006(ポート オーバーランです。ハードウェアから 1 文字が読み取られる前に、次の文字が受信されたため、先の文字は失われました。)というエラーが返却されます。
デスクトップPCでは何日か継続して通信させておいても、全くこのエラーが出ないのに
ノートPCでは数秒~数分で頻繁に発生します。
このエラーの意味について調査したのですが、様々なHPを見ると、FIFOバッファ(通常16バイト)のエリアが一杯になり、前にかかれていたデータが上書き
されたという事ではないかという所に辿り着きました。そこで、デバイスのポート設定の詳細
にて受信バッファを低レベル(1バイト受信毎にCPU割り込みを発生)にする事により、なるべく
FIFOバッファの余裕を持たせる設定にすれば、問題は解決あるいは頻度の減少を期待出きる
と思い、設定したのですが、結果は全く変わりませんでした。そこで質問です。
1)このエラーの意味は本当にFIFOバッファのオーバーランなのでしょうか。
2)もし、そうであるならば、解決策はあるのでしょうか? フロー制御で回避出きる問題ではありませんよね?
3)このFIFOバッファあたりの調査が可能なツールはありますでしょうか?出きれば、本当にFIFOバッファが一杯になる現象がデータとして取得出きればうれしいのですが。
現在、MSCommの設定としては以下の通りです。
Settings=115200,N,8,1
InBufferSize=3000
Handshaking=2
以上、1)~3)すべてでなくても構いません、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
全てお察しの通りです。
おそらくWin2000マシンの方はパワーがあるので間に合っているが、Meマシンはパワー不足で間に合わず、フロー制御がかからないため、デバイス上のFIFOバッファを使い切り、そこでデータを喪失しているのでしょう。
バイナリーファイルのやりとりならソフトウェアフローは使用できませんね。相手側にもちゃんとハードウェアフローをしてもらうしかないでしょうし、それで解決するはずです。
それと、前回の回答でも書きましたが、ケーブルのせいかもしてないので、その辺はきちんと調査して切り分けてくださいね。
No.2
- 回答日時:
受信バッファは3000バイトを指定していますから充分ですね。
MSCommのフロー制御はデバイスの受信バッファ(16バイト)の使用量によって自動的に制御線を操作してくれるはずですから、以下の2点が怪しいと思います。
・ケーブルの結線でRTS、CTSが自分自身に戻されている。
・相手側がフロー制御無しになっている。
MSCommのプロパティでHandshaking=0、RTSEnable=Falseとしてみて動作させ、相手がデータを送信してくるようなら、フロー制御ができていません。一度試してみてください。
あと、あんまり解決にならないんですが、コンパイルオプションで速度重視にすれば、エラーの確率をちょっぴり落とせるかも。
この回答への補足
ご回答ありがとうございます。
おっしゃる通り、Handshaking=0、RTSEnable=Falseで試してみても相手からデータを送信してきました。
これはフロー制御が出来ていないという事ですね。バイナリ-送受信の為、ソフトウェアフロー制御を行いたくないので、
MSCommの設定としてはHandShaking=2にして、RTSEnable=Trueとする設定を行い、相手側もそれに
あわせるという事でよろしいのでしょうか?また、この問題はハードウェアフロー制御を行う事により、
完全に解決されるのでしょうか?あと、このエラーというのは私の推察通り、やはりFIFOバッファー(メインメモリー上
の受信バッファーではなく)上のデータ喪失と捉えてよろしいのでしょうか?
以上、再度ご回答願えればうれしいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
あるあるbotに投稿したけど採用されなかったあるある募集
あるあるbotに投稿したけど採用されなかったあるあるをこちらに投稿してください
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
実行時エラー '8021'とはどんな内容のエラーでしょうか?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
winsockでソケット通信の開発を...
-
シリアル通信の出力バッファと...
-
socket: recvはいつ,どれだけ...
-
Linuxでのシリアル通信について...
-
ClearCommError呼び出し時のCE_...
-
mscommの受信バッファ異常について
-
rs232cでの受信データ(mscomm)...
-
MIDIデータを受信するためのプ...
-
ソケット通信内 read関数について
-
WinsockAPIのrecvfromの受信デ...
-
シリアル通信 大きいサイズの...
-
シリアル通信エラー
-
winsockの動作について。
-
シリアルポート通信
-
ネットワークカメラの動画保存...
-
TCP/IP通信プログラミングにお...
-
Macターミナルで実行中のプログ...
-
3のつく数字と3の倍数のみを表...
-
プロダクションコードとは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
WriteFile()でのデータ送信がで...
-
winsockでソケット通信の開発を...
-
socket: recvはいつ,どれだけ...
-
シリアル通信の出力バッファと...
-
「スイッチングハブのバッファ...
-
SocketのSend関数でのCLOSEの検...
-
Connection reset by peer
-
WaitForMultipleObjects関数の...
-
RS232C通信(PC⇔PLC)
-
VB2005でWin32APIを用いてRS-23...
-
Linuxでのシリアル通信について...
-
UDP処理のエラーについて
-
シリアルポート通信
-
ソケット通信内 read関数について
-
TCP/IP通信プログラミングにお...
-
rs232cでの受信データ(mscomm)...
-
write関数でEAGAINのエラー発生...
-
シリアル通信ができません
-
【CAsyncSocket::OnReceive()呼...
おすすめ情報