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