• ベストアンサー

RS-232Cでバイナリデータを受信する方法

2台のPCを使用しバイナリファイルをRS232Cを使用し1台目のPCは送信専用、2台目のPCは受信専用で、送信側のPCから出したデータを受信側PCでデータの内容を判断し集計するプログラムを作ろうとしています。 送信側のPCでは、"AAB9AAC2AACC01D8AAE2・・・”といった内容のバイナリファイルの内容を1バイトずつ読み込み、それをMsCommを用いてバイナリモードで送信させて、EOFになるまで永遠とそれを繰り返します。 問題は受信側で、たとえば上記のデータの中の"AAB9"ならばカウントを1つ上げる、"AACC01D8"ならばカウントを1つ下げ、それを表示するといったような処理をリアルタイムで行いたいのですが、どうしてもデータの取りこぼしが発生します。 また、データの意味合いとしては、必ず"AA"という1バイトのデータから始まり、それに1バイトから5バイトまでのデータが可変長で付いてきて次の"AA"までが1つの意味となります。 通信パラメータは9600、8ビット、ストップビット1、パリティなしで、その他の制御線は一切使用しないという条件です(要するにRxD、GND線のみの最低限の条件) 受信側のバッファは1024バイトで、MSComm1.RThreshold = 1でOnCommを発生させています。また、送信側のファイルの大きさは1kバイトほどです 正直なところ、このようなことが可能なのかどうかもわからない状況なのですが、現状ではデータを数バイト取りこぼしているだけのようなのでできないことはないのではないか?と考えています。 どなたか、参考文献、ホームページ、プログラム、考え方等を何でもかまいませんん!ぜひ、ご教授願います!!また、現在はVBにて開発中ですが、最悪、言語は問いません。よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#21649
noname#21649
回答No.3

たしか.1秒に1回100msほど.タイマー関連の処理に取られて.結構速度を落とさないと.取りこぼしが発生するようです。 私の関係した対応では. バッファを巨大にする 転送速度を4800に落とす 受信ソフトの実行速度をあげるため.受信中は他の仕事をさせない の3店でした。

kouichi125
質問者

お礼

お礼が遅れて申し訳ございませんでした。 ここ2,3日たてこんでたもので・・・ 具体的な数値を頂き、非常に参考になります。 ありがとうございました。

その他の回答 (2)

  • yanmaa
  • ベストアンサー率45% (207/457)
回答No.2

過去質問を検索して下さい。キーワードは「MSComm」で十分でしょう。 参考までに該当しそうな過去質問を参考URLにつけておきます。

参考URL:
http://www.okweb.ne.jp/kotaeru.php3?q=135370
kouichi125
質問者

お礼

ご回答ありがとうございます。 教えていただいたホームページを拝見させていただきました。 早速ポーリングによる方法を試してみます。

回答No.1

バイナリデータの送受信ですと、Xon/Xoffを使ったフロー制御ができないので、基本的にハードウェアハンドシェークをするしかありませんが、制御線が結線されていないので、これもだめ。ということなら、データ受信中には何の制御もしてはだめで、受信に専念してバッファに貯める。貯めたあとで、処理をおこなうしかないと思います。

kouichi125
質問者

お礼

早速の回答ありがとうございます。 素人考えで非常に申し訳ないのですが、 >データ受信中には何の制御もしてはだめで、受信に専念してバッファに貯める。>貯めたあとで、処理をおこなうしかないと・・・ と、ありますが、たとえばハイパーターミナル等は、どのようにしているのでしょうか? 当然、ハイパーターミナルでは複雑な処理等は行っていないとは思うのですが、現状では、単に受けたデータを表示させるだけでも、データが落ちてしまっています。サンプルソースや、ホームページ等あれば、お教えください。