投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/7/11 01:33:09
F2-F0-xx-yy パターンの処理例を書いてみました。

得られた値が 10bit 範囲(&H0~&H3FF)に納まっているかどうかのチェックは省いています。
また、xx-yy 部のエンディアンが異なる場合には、上位バイトと下位バイトの入れ替えも必要です。


Private Delegate Sub Delegate_RcvDataToTextBox(data As UShort)
Private Sub RcvDataToTextBox(rdat As UShort)
    RcvTextBox.AppendText(Str(rdat))
    'RcvTextBox.AppendText(CStr(rdat)) 
End Sub

Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    If Not SerialPort1.IsOpen Then
        Return
    End If

    If SerialPort1.BytesToRead >= 4 Then
        Dim bin(3) As Byte

        'まずは 2 バイト取り出して、F2,F0 が連続しているか確認する 
        SerialPort1.Read(bin, 0, 2)
        If bin(0) = &HF2 AndAlso bin(1) = &HF0 Then
            'F2-F0-xx-yy パターン 
            SerialPort1.Read(bin, 2, 2) 'もう2バイト追加 
            Dim n As UShort = BitConverter.ToUInt16(bin, 2)
            Invoke(New Delegate_RcvDataToTextBox(AddressOf RcvDataToTextBox), n)
            Return
        End If

        '3 バイト目を取り出して、F2,F0 が連続しているか確認する 
        SerialPort1.Read(bin, 2, 1)
        If bin(1) = &HF2 AndAlso bin(2) = &HF0 Then
            'yy-F2-F0 パターン。 
            'この yy は利用できないので、Invoke せずに次の受信を待つ 
            Return
        End If

        '4 バイト目を取り出して、F2,F0 が連続しているか確認する 
        SerialPort1.Read(bin, 3, 1)
        If bin(2) = &HF2 AndAlso bin(3) = &HF0 Then
            'xx-yy-F2-F0 パターン 
            Dim n As UShort = BitConverter.ToUInt16(bin, 0)
            Invoke(New Delegate_RcvDataToTextBox(AddressOf RcvDataToTextBox), n)
            Return
        ElseIf bin(3) = &HF2 AndAlso bin(0) = &HF0 Then
            'F0-xx-yy-F2 パターン 
            Dim n As UShort = BitConverter.ToUInt16(bin, 1)
            Invoke(New Delegate_RcvDataToTextBox(AddressOf RcvDataToTextBox), n)
            Return
        End If

        '合致パターン無し! 
        Debug.WriteLine("不正なデータ:" & BitConverter.ToString(bin))
    End If
End Sub