タイトル | : Re^3: VB2010 シリアル受信通信 byte で上手くいかない |
記事No | : 11886 |
投稿日 | : 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 です。
|