投稿者 魔界の仮面弁士  (社会人) 投稿日時 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 しか無いわけなので、当然例外になります。