Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
シリアル通信の受信データを表示
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30252#CommentId82882
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
2017/7/7 09:35:13
> data.lengthを2に設定し、2バイト溜まっていなければスルーする形でテストしました。
data.Length は 2 になっていませんし、スルーする形にもなっていません。
> Dim data(SerialPort1.BytesToRead - 1) As Byte
> SerialPort1.Read(data, 0, 2)
> If SerialPort1.BytesToRead < 2 Then
> Return
例えば、SerialPort1.BytesToRead が「0」や「1」を返した場合に
どのような動作になるのかを、改めて想像してみてください。
BytesToRead が 「0」だった場合、今のコードだと
Dim data(-1) As Byte 'これは data.Length = 0 な配列になる
SerialPort1.Read(data, 0, 2)
に相当する処理が行われることになります。
データが来ていないにも関わらず、Read を呼び出すことになりますし、
0バイトしか確保されていない配列に 2 バイト読み込もうとするので
先の例外が発生してしまうはずです。
検査用の If 文が置いてあるのはその後ですので、既に手遅れです。
一方、BytesToRead が「1」を返すタイミングだった場合には、
Dim data(0) As Byte 'これは data.Length = 1 な配列になる
SerialPort1.Read(data, 0, 2)
となるわけですが、これも、データが 1 バイトしか溜まってないうちに
2 バイトを読み込もうとしていることになりますし、
data.Length は 1 しか無いわけなので、当然例外になります。