投稿者 vb素人  (学生) 投稿日時 2017/7/12 11:18:42
魔界の仮面弁士さま

次の送信データに対応したコードが完成しました。
何回か試していますが、一応できていると思われます。
(1つ前の質問における、データの並び順は解決していませんが、とりあえず配列の順番を変えて対応しています。)

私の理解できる範囲で書いているので、長いコードになってしまっています。


[送信データ]
 F2 F0 (先頭検出用データ)
  x1 x2 (X座標データ 0~10bitの範囲)
  y1 y2 (Y座標データ 0~10bitの範囲)


X, Yのデータ毎にText Boxに表示させています。


    Private Delegate Sub Delegate_RcvXDataToTextBox(xdec As String)
    Private Delegate Sub Delegate_RcvYDataToTextBox(xdec As String)

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

        If SerialPort1.BytesToRead >= 6 Then
            Dim bin(5) As Byte

            '① 2 バイト取り出して、F2,F0 が連続しているか確認する 
            SerialPort1.Read(bin, 0, 2)
            If bin(0) = &HF2 AndAlso bin(1) = &HF0 Then
                'F2-F0-x1-x2-y1-y2 パターン 
                SerialPort1.Read(bin, 2, 4) 'もう4バイト追加 

                Dim datax As Byte() = {bin(3), bin(2)}
                Dim xbyte As UShort = BitConverter.ToUInt16(datax, 0)    '符号なし2 バイト整数に変換 
                Dim xdec As String = Convert.ToString(xbyte, 10)           '10進数表記の "1023" に変換 
                Invoke(New Delegate_RcvXDataToTextBox(AddressOf RcvXDataToTextBox), xdec)

                Dim datay As Byte() = {bin(5), bin(4)}
                Dim ybyte As UShort = BitConverter.ToUInt16(datay, 0)    '符号なし2 バイト整数に変換 
                Dim ydec As String = Convert.ToString(ybyte, 10)           '10進数表記の "1023" に変換 
                Invoke(New Delegate_RcvYDataToTextBox(AddressOf RcvYDataToTextBox), ydec)

                Return
            End If

            '3 バイト目を取り出して、F2,F0 が連続しているか確認する 
            SerialPort1.Read(bin, 2, 1)
            If bin(1) = &HF2 AndAlso bin(2) = &HF0 Then
                Return
            End If

            '4バイト目を取り出して、F2,F0 が連続しているか確認する 
            SerialPort1.Read(bin, 3, 1)
            If bin(2) = &HF2 AndAlso bin(3) = &HF0 Then
                'y1-y2-F2-F0-x1-x2パターン。 
                SerialPort1.Read(bin, 4, 2) 'もう2バイト追加 

                Dim datax As Byte() = {bin(5), bin(4)}
                Dim xbyte As UShort = BitConverter.ToUInt16(datax, 0)    '符号なし2 バイト整数に変換 
                Dim xdec As String = Convert.ToString(xbyte, 10)           '10進数表記の "1023" に変換 
                Invoke(New Delegate_RcvXDataToTextBox(AddressOf RcvXDataToTextBox), xdec)

                Dim datay As Byte() = {bin(1), bin(0)}
                Dim ybyte As UShort = BitConverter.ToUInt16(datay, 0)    '符号なし2 バイト整数に変換 
                Dim ydec As String = Convert.ToString(ybyte, 10)           '10進数表記の "1023" に変換 
                Invoke(New Delegate_RcvYDataToTextBox(AddressOf RcvYDataToTextBox), ydec)

                Return
            End If


            '5 バイト目を取り出して、F2,F0 が連続しているか確認する 
            SerialPort1.Read(bin, 4, 1)
            If bin(3) = &HF2 AndAlso bin(4) = &HF0 Then
                'x2-y1-y2-F2-F0(-x1) パターン。 
                Return
            End If