投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/7/7 13:17:24
> Dim data(SerialPort1.BytesToRead - 1) As Byte
BytesToRead の値を If で検査する前に使っちゃ駄目ですよ。

今回は 2 バイトの固定長データのようなので、たとえば

Dim size As Integer = SerialPort1.BytesToRead
If size < 2 Then
 Return
End If
Dim data(size - 1) As Byte
SerialPort1.Read(data, 0, size)


もしくは

Dim size As Integer = SerialPort1.BytesToRead
If size < 2 Then
 Return
End If
Dim data(1) As Byte
SerialPort1.Read(data, 0, 2)


のように、サイズをチェックしてから配列を確保するようにします。

もし、size が 2 の時は両者で同じ結果が得られますが、
複数のデータがバッファにたまっていて、仮に size が 3 や 4 を
返してきた場合の振る舞いは両者で異なります。適宜使い分けてみてください。


> 「1023」と表示することができましたが、
おめでとうございます。


> 「1023」と表示することができましたが、まれに「-253」と表示することがあります。
それぞれ、こういうバイナリですよね。
1023 = &H03FF
-253 = &HFF03


例えばデータが「03,FF,03,FF,03,FF,…」と流れてきた場合、
どこからどこまでの 2 バイト分を処理するのかによって、
結果が変わってくることになります。


> 受信側で"S"を受信したら、そこから2バイト取得する形にしてみました。
Encoding 設定が ASCII だとしたら、"S" というのは &H53 のことですね。

1023 (&H03FF) の場合は &H53 が含まれないので良さそうですが、
 595 (&H0253) や 21432 (&H53B8) のように、&H53 を含む
バイナリーが送出されてくる可能性は無いのでしょうか。


> 1文字("S")を受信するので、ReadExisting()を使用しているのですが
全ての電文が文字列で構成されているのならば良いですが、
今回は文字として処理できないバイナリーが含まれているので、
ReadExisting は使わない方が良いのでは無いでしょか。