タイトル : Re^4: VB2010 シリアル受信通信 byte で上手くいかない 投稿日 : 2017/08/15(Tue) 07:59 投稿者 : MSAKA
YuO さん shuさん 魔界の仮面弁士さん おかげで目的の無線機からの受け取りが出来るようになりました 入り口でひっかかっていたのが何とか進められそうです 訳のわかっていない私に根気よく色々とアドバイスいただき 本当にありがとうございました > 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 です。 仰せのとおりです 便利な方法ですね 以降利用させていただきます |