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

まず、送信データですが、
F2-F0-03-FFが繰り返し送信されます。(受信も同じ並び)

WriteUSART(1023  >> 8);      // 0x03
delay_ms(50);
WriteUSART(1023  & 0x00FF);  // 0xFF

データの並び順の確認は、
XCTU(XBeeの設定ツール)を使用して確認しました。

少し時間が掛かりましたが、
魔界の仮面弁士さまから教えていただいたコードを一応理解した上で、使ってみました。

Delegateの部分だけ修正させていただきました。
コードを↓に掲載します。

※結果
①先頭検出で失敗(今までは、先頭検出できないと、テキストBoxに受信データが書き込まれない失敗)は無くなりました。ありがとうございます。

②受信データが65283(FF 03)となってしまいます。

送信データは、確かに03 FFの順で送られているのに、なぜここで逆になってしまうのかが理解できません。

③これができた後、F2 F0 x1 x2の後に、もう1つy1 y2を送ることを考えています。
 F2 F0 (先頭検出用データ)
  x1 x2 (X座標データ 0~10bitの範囲)
  y1 y2 (Y座標データ 0~10bitの範囲)
  ②が解決したら、こちらを試してみます。


    Private Delegate Sub Delegate_RcvDataToTextBox(n As UShort)

    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


    Private Sub RcvDataToTextBox(n As UShort)
        If IsNothing(n) = False Then
            Dim b1 As String = Convert.ToString(n, 10)       '10進数表記の "1023" に変換 
            RcvYTextBox.AppendText(b1)
        End If
    End Sub