• 締切済み

SerialPortのDataReceivedイベントについて

Visial Basic 2005 にて SerialPort コンポーネントを使ったアプリを作っています。 当初、Microsoft のサンプルを参考に SerialPort1.ReadLine でデータを受信していたのですが、この方法だとバッファ内から再度同じデータを受信してしまうらしく、新しいバッファからデータを受信しないとイベントが発生する毎に古いデータを読み取ってしまいます。 そこで調べていたところ、Microsoft のフォーラムで以下のような Visual C# のソースを見つけました。 (以下引用) > if (serialPort1.BytesToRead > 0) > { > // 受信バッファからデータを取得 > byte[] b = new byte[serialPort1.BytesToRead]; > Read(b, 0, b.Length); > } まだ Visial Basic 初心者なもので Byte 型の扱い方や上記ソースは Visial Basic でどのように書けばよいのかわかりません。 どなたかご教授ください。 よろしくお願いいたします。

みんなの回答

  • miyuyu
  • ベストアンサー率61% (30/49)
回答No.1

こんにちは、もう解決しているかもしれませんが。 ReadLineのヘルプには、 入力バッファ内の NewLine 値まで読み取ります と記載してあります。Framework2.0からの機能なんですね。 私の場合、データ受信後その内容により返事を返すまでの間 次のデータを受信することは無い場合が多いので DataReceivedイベントでSerialPort.Readを利用しています。 ReadLineは使用したことが無いのでわかりませんが Readの場合、読み込んだデータがバッファに残っているということはありません。

ikspiari
質問者

お礼

SerialPort.ReadLine を使っても、SerialPort.DiscardInBuffer でバッファを削除したら問題なく動作しました。 ありがとうございました。

ikspiari
質問者

補足

アドバイスありがとうございます。 今のところまだ未解決なのですが、私も miyuyu さんと同じようにデータ受信の内容に応じて返事をするというものを作っています。 問題となっている現象は、二度目のデータ受信時の DataReceived イベント発生の際に一度目に送った返事を即送り出してしまうという感じです。 Write の方のバッファもあやしい気がするのですが、差し支えなければ Read の使い方を教えていただけますと幸いです。 よろしくお願いします。

すると、全ての回答が全文表示されます。

関連するQ&A