Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
シリアル通信の受信データを表示
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30252#CommentId82902
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
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