1

COM2 ポートでデータを受信する C# プログラムを作成しました。ボーレートは 115200 に設定されています。送信側は 115200bps でデータを送信しています。私のプログラムは時折数バイトを失います。COM ポートからループ内ReadByteのデータを読み取るメソッドを呼び出しています。while(true)

いくつか質問があります:

  • ボーレートを高く設定すると、データが失われる可能性がありますか? はいの場合、なぜですか?
  • リードバッファのサイズを 100*1024*1024 に設定しています。これにより、シリアル ドライバのバッファ サイズが 100*1024*1024 に設定されますか?

この問題をデバッグする方法について何か考えはありますか?

4

2 に答える 2

4

100*1024*1024 の受信バッファ サイズは巨大です! このサイズが必要なのか、実際のシリアル ポート バッファが必要なのか、まったく疑わしいと思います。

レシーバーの物理的な受信バッファーがオーバーフローしている可能性があるため、フロー制御の使用を検討する必要がある場合があります。これにより、レシーバーがトランスミッターに「ちょっと待って、しばらく送信を停止してください。最初に持っているものを処理させてください」と効果的に言うことができます。

ハードウェア フロー制御は、(一般的に) RTS (Request To Send) および CTS (Clear To Send) ピンを介して利用されます。

この記事を見て、それについてもう少し説明します。

個人的には、シリアル ポートの ReceivedBytesThreshold プロパティをデフォルト値の 1 のままにして、DataReceived イベントを処理することをお勧めします。明日には、20 バイト、あるいは 5 バイトのメッセージを読む必要があるかもしれません。将来、可変長のメッセージを読み取る必要があるのではないでしょうか? しきい値を 1 のままにしておくと、現在および将来受信されるすべてのバイトを処理できることを意味します。

このしきい値は、バッファに少なくとも1 バイトある場合にイベントが発生することを意味します。もっとあるかもしれませんし、おそらくそうなるでしょう。1 バイトを受信するたびに起動するとは限らないことに注意してください。各イベントで、BytesToRead プロパティを確認し、この数を独自のバッファーに読み込む必要があります。

1 バイトを受信するたびにイベントが発生するとは限らないことを繰り返しておきましょう。

また、DataReceived イベント ハンドラー内でできる限り少ないことを行うことをお勧めします。受信したバイトをバッファに読み込み、さらに処理するために完了したメッセージをキューに追加しますが、他にはほとんど何もしません。

また、 RS232の標準最大仕様は速度 19200 ボー、ケーブル長 50 フィートであることに注意してください。それ以上のものは未定義です。一般に、速度を高速にするには、より優れたケーブル (より低い静電容量) とより短いケーブル長が必要です。モーター、モーターインバーター、ライブケーブルなどの他の「ノイズの多い」アイテムの近くで実行されていないことを確認してください。

于 2010-12-31T12:22:35.327 に答える
3

ボーレートを高く設定すると、データが失われる可能性がありますか? はいの場合、なぜですか?

必ずしも。物理的な接続が悪い (長すぎる) ために発生する可能性があります。

リードバッファのサイズを 100*1024*1024 に設定しています

それは(方法)十分すぎるはずです。

そうは言っても、ループして単一バイトを読み取ることは、ポートを読み取る最も効率的な方法ではありません。

DataReceived イベントに接続して、ReceivedBytesThreshold=12 を設定できます。そうすれば、いつでも Read(Buffer, 0, 12) だけを実行できます

于 2010-12-31T10:38:39.780 に答える