0

C#センサーと PC との通信にシリアル ポート ライブラリを使用しています。SerialPort.Read()そこにデータがあっても、メソッドで頻繁にタイムアウトが発生します。シリアル スニファを使用して、ポートですべてのパケットを受信して​​いることを確認しましたが、.NET がすべてのパケットを選択せず​​、タイムアウトになったことがあります。バイトを読み込んでいますが、受信しているバイトはシリアル ポートのバッファ サイズより 2112 少なくなっています。私は複数のことを試しましたが、今はネイティブを使用してC/C++で呼び出すことを考えていC#ます。誰かがより多くの考えを共有したり、ネイティブC/C++コードを使用したりできますかC#.

4

1 に答える 1

1

ボーレート 460800 ~ 921600 で動作

これらはかなり奇妙なボーレートで、かなり高いです。明らかに DataReceived イベントを使用していないため、Read() メソッドを呼び出す頻度がかなり重要になります。Windows がもっと重要なことを実行する必要があると考えて、スレッドからコンテキスト スイッチを切り替えるなど、他のことをするのに少し時間をとってください。受信バッファがすぐにオーバーフローします。SerialPort.ErrorReceived イベントを実装しないのはよくある間違いなので、これらのオーバーフローが表示されず、データが欠落しているだけです。

このコードを C++ で記述しても、問題が解決する可能性はほとんどありません。シリアル ポート用の API は 1 つだけです。SerialPort はシン ラッパーであり、C++ コードのように winapi 関数を使用します。

したがって、次のすべての手順を実行します。

  • オーバーフローが発生したことがわかるように、ErrorReceived イベントを実装します。
  • Read() を頻繁に呼び出すことに依存しないように、DataReceived イベントを使用することをお勧めします。
  • ドライバーがたるみを取ることができるように、ReadBufferSize を適切な大きな数値に設定します。
  • Handshake プロパティを設定して、バッファーがいっぱいになったときにドライバーがデバイスに送信を停止するように指示できるようにします。
  • デバイスがマシンを単に起動しないようにプロトコルを実装できるかどうかを確認します
  • それでも信頼性が十分でない場合は、ボー レートを下げます。
于 2013-02-13T22:13:39.713 に答える