tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^3: VB2010 シリアル受信通信 byte で上手くいかない
投稿日: 2017/08/14(Mon) 14:49
投稿者魔界の仮面弁士
Private Delegate Sub Delegate_RcvDataToTextBox( data As String )
は今回使わないで下さい。
受信データが文字列ではなくバイナリーである以上、
元データを As String に変換してから扱うのは御法度です。


> System.Text.Encoding.GetEncoding(932)
これも今回、出番が無いですね。


SerialPort1_DataReceived の中では、データは「Byte 配列」のまま取り扱いましょう。
たとえばこんな感じ。

'この TextBox1 は MultiLine = True にしておく
Private Sub RcvDataToTextBox(data() As Byte)
    TextBox1.AppendText(BitConverter.ToString(data) & vbNewLine)
End Sub


Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    If Not SerialPort1.IsOpen() Then
        Return    ''シリアルポートをオープンしていない場合、処理を行わない。
    End If

    Dim receivedData(SerialPort1.BytesToRead - 1) As Byte
    SerialPort1.Read(receivedData, 0, receivedData.Length)

    Invoke(New Action(Of Byte())(AddressOf Me.RcvDataToTextBox), receivedData)
End Sub




> RecX = RecX & bytes(I)
これだと、たとえば元データが
 bytes = New Byte() {1, 2, 3, 2, 1}  '5バイト
 bytes = New Byte() {12, 32, 1}  '3バイト
 bytes = New Byte() {123, 21}  '2バイト
のいずれであっても、連結結果が "12321" になってしまい、区別できませんね。

10進数で確認したいなら、せめて『RecX &= "," & CStr(bytes(I))』のようにします。
これなら、上記 3 パターンでも ",1,2,3,2,1"、",12,32,1"、",123,21" となり、区別できます。


> Z = Asc(SData)
> If Z < 10 Then Y = "0" & Hex(Z) Else Y = Hex(Z)
> RData = RData & Y
Hex 関数を使うと、先頭の "0" が抜け落ちてしまうので、
上記のような処理を書いていたのだと思いますが、
「2 桁の 16 進数」として得たいのであれば、
  Y = Z.ToString("X2")
だけで OK です。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。