投稿者 vb素人  (社会人) 投稿日時 2017/7/7 11:45:50
魔界の仮面弁士さま

>例えば、SerialPort1.BytesToRead が「0」や「1」を返した場合に
>どのような動作になるのかを、改めて想像してみてください。

想像してみて少し理解することができました。
Readの位置がおかしな場所にありました。

2つ報告があります。
①次の通り修正し、2バイト揃ってから、2バイト受信する形にしました。(しているつもりです。)

Dim data(SerialPort1.BytesToRead - 1) As Byte

If SerialPort1.BytesToRead < 2 Then
'受信データが溜まってない場合は、Read せずにスルー 
Return
End If
SerialPort1.Read(data, 0, 2)

Invoke(New Delegate_RcvDataToTextBox(AddressOf Me.RcvDataToTextBox), Data)


データの変換は次の通り行なっています。
    Private Sub RcvDataToTextBox(data As Byte())

        '受信データをテキストボックスの最後に追記する.
        If IsNothing(data) = False Then
            'RcvTextBox.AppendText(CStr(data))

            Dim bin As Byte() = {data(1), data(0)}
            Dim a As Short = BitConverter.ToInt16(bin, 0)   '符号付き 2 バイト整数に変換 
            Dim b As String = Convert.ToString(a, 10)  '10進数表記の "1023" に変換 
            RcvTextBox.AppendText(b)
            'RcvTextBox.AppendText(BitConverter.ToString(data))
        End If

    End Sub

その結果、「1023」と表示することができましたが、まれに「-253」と表示することがあります。
データ(バイト)の区切りがおかしいのでしょうか。



②これを回避するために、データの始まりを明確にしようと考えました。
送信側から"S"を送信し、
受信側で"S"を受信したら、そこから2バイト取得する形にしてみました。(そのつもりでコードを書いてみました)

しかし、このコードで確認した所、Debug Lineに"?"が表示されてしまいます。
1文字("S")を受信するので、ReadExisting()を使用しているのですが、何か間違いがあるのでしょうか。


            Dim sdata As String
            sdata = SerialPort1.ReadExisting()
            Debug.WriteLine(sdata)

            If sdata = "S" Then

                Dim data(SerialPort1.BytesToRead - 1) As Byte


                If SerialPort1.BytesToRead < 2 Then
                    '受信データが溜まってない場合は、Read せずにスルー 
                    Return
                End If

                SerialPort1.Read(data, 0, 2)
                Invoke(New Delegate_RcvDataToTextBox(AddressOf Me.RcvDataToTextBox), data)

            End If