3

次のようなコードを使用して、シリアル ポート (つまり、COM3) に送信されたデータを読み取っています。

_serialPort.PortName = "COM3";
_serialPort.BaudRate = 9600;
_serialPort.Parity = Parity.None;
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.One;
_serialPort.ReadTimeout = 500;
_serialPort.WriteTimeout = 500;
_serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);
_serialPort.Open();

そのシリアル ポートからのデータはコマンドであり、'\0' で終わる任意の長さの文字列にすることができます。そのようなデータを効率的に読み取る方法に関するベスト プラクティスを探しています。プロデューサー/コンシューマーのパターンが最適かもしれないと考えています。

  1. DataReceived イベントが発生するたびに、ポートから文字列を読み取り、stringbuffer またはその他の構造に追加します。
  2. 次に、char '\0' の stringbuffer または構造体を常に検査し、見つかった場合はコマンド文字列を解析して削除する別のスレッドがあります。

これは、これを処理する最も効率的な方法でしょうか? dataReceived イベントに依存しないブロッキング シリアル読み取り関数はありますか?

4

1 に答える 1

5

イベントが頻繁に発生する可能性があり、イベントでコードが実行されているときにdataReceievedブロックされることがわかりました。SerialPortこの機能が必要かもしれませんが、役に立つかもしれないし、役に立たないかもしれない情報がここにあります。

私はTimer、しばしば 10  Hzで使用します。でTimer、チェックしSerialPort.BytesToRead > 0ます。次にSerialPort.ReadLine、1 行のテキストを読み取り、インバウンド バッファーを処理するための大量のコードを保存する which を使用します。

Loopまでの場合はBytesToRead == 0、各行を後で処理するためにバッファに読み込むか、読み取りの直後に処理します。

あなたの例のReadTimeoutプロパティは、Arduino がテキスト行を作成するのにかかる時間を知っている場合に役立ちExceptionますReadTimeout

于 2012-09-25T17:18:12.817 に答える