タイトル : Re^2: VB2010 シリアル受信通信 byte で上手くいかない 投稿日 : 2017/08/07(Mon) 19:40 投稿者 : MSAKA
shu さん 早々ありがとうございます 苦戦していますのでよろしくお願いします OS Windows 7 64Bit > > Private Sub RcvDataToTextBox(data As String) > dataをstringで渡していますが受信データは文字列ではないのではないですか? >>>そのとおりですが問題ありますか BitConverter.ToString(Byte())の結果は > 各要素を16進にしてハイフンで区切った文字列なので > このループは同じ文字列を文字列長だけ連結することになるかと > 思います。 > hhttps://msdn.microsoft.com/ja-jp/library/3a733s97(v=vs.110).aspx >>>そのとおりですね 無駄なことをやていました > > > 3F-66-063F-66-063F-66-063F-74-3F3F-74-3F3F-74-3F > なのでこれは > {3F,66,06} > {3F,74,3F} > という2つのバイト列が取得出来ていることになります。ただShift-Jis文字列から > バイト列に変換しているのでデータが欠落している可能性があります。 >>> ここは不明検証していません **** ひょっとして受信イベント処理との整合性に問題があるのでしょうか データ受信が発生したときのイベント処理 (やっていること良く理解できません) Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived 'シリアルポートをオープンしていない場合、処理を行わない. If SerialPort1.IsOpen = False Then Return End If Try '受信データを読み込む. Dim data As String data = SerialPort1.ReadExisting() '受信したデータをテキストボックスに書き込む. Dim args(0) As Object args(0) = data Invoke( New Delegate_RcvDataToTextBox( AddressOf Me.RcvDataToTextBox ), args ) Catch ex As Exception MsgBox( ex.Message ) End Try End Sub 受信データをテキストボックスに書き込む. 以下のコードです s = BitConverter.ToString(bytes) の結果を検証するために 幾つかのよけいなコードを記述してあります Private Sub RcvDataToTextBox(data As String) Dim Z As Integer Dim LenX As Integer Dim I As Integer Dim DD As String Dim RecX As String LenX = Len(data) Dim s As String Dim SData As String Dim RData As String Dim Y As String DD = "" RecX = "" SData = "" RData = "" Dim bytes() As Byte = System.Text.Encoding.GetEncoding(932).GetBytes(data) s = BitConverter.ToString(bytes) For I = 0 To LenX - 1 ' Step 2 SData = Mid(data, I + 1, 1) Z = Asc(SData) If Z < 10 Then Y = "0" & Hex(Z) Else Y = Hex(Z) RData = RData & Y DD = DD & Hex(bytes(I)) RecX = RecX & bytes(I) 'Stop Next RcvTextBox.AppendText(DD) 'で示す値 >> 3F6663F743F TextBox1.AppendText(RecX) 'で示す値 >> 6310266311663 TextBox2.AppendText(RData) 'で示す値 >> 3F66063F743F 'Stop End Sub ちなみに s = BitConverter.ToString(bytes) で示す値 >> 3F-66-06-3F-74-3F Dim bytes() As Byte = System.Text.Encoding.GetEncoding(932).GetBytes(data) で受け取った文字列は上記方法では全て同じでした 当たり前ですね 受け取った時点で違っていることになりませんか VBA(2003と古いです)で以下のコードで受信が動いています RECDATA$ = ec.Ascii 'ポートから受信 Lenx = Len(RECDATA$) For i = 1 To Lenx P$ = Mid$(RECDATA$, i, 1) If P$ = Chr$(&HFD) Then Exit For Next i ’ここまでのFor nextは意味がなさそう For k = 1 To Lenx P$ = Mid$(RECDATA$, k, 1) m = Asc(P$) If m < 16 Then X$ = "0" + Hex$(m) Else X$ = Hex$(m) D$ = D$ + X$ ’この文字列から必要な部分を切り取りする Next k これで無線機から変換した (たとえば FEFE66000600FEを変換)を送ってると受信文字列を変換して FEFE00660600FE を読み取れます 無線機からの文字列はPCから送るのと同様 16進数のコードを文字列にしているはずで 以下がPC側から送る文字列の変換 PR$ = Chr$(&HFE) + Chr$(&HFE) ' データ始まりの同期コード RE$ = Chr$(&H66) ' 無線機のアドレス TX$ = Chr$(&H0) ' PCのアドレス CMA$ = Chr$(&H6) ' コマンド CMA$ = Chr$(&H0) ' サブコマンド FI$ = Chr$(&HFD) ' 終わりのコード TxString = PR$ + RE$ + TX$ + CMA$ + CMB$ + FI$ '合成して送る 尚 VB2010 でのPCから無線機への送信は以下のコードで上手く働きます Private Sub SndButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SndButton.Click Dim N As Integer = 5 Dim bytOut() As Byte = New Byte(N + 1) {} bytOut(0) = &HFE bytOut(1) = &HFE bytOut(2) = &H66 bytOut(3) = &H0 bytOut(4) = &H6 bytOut(5) = &H0 bytOut(N + 1) = &HFD SerialPort1.Write(bytOut, 0, bytOut.Length) End Sub これのリアルタイムでの受信バージョンができれば良いのですが・・・ご指導をよろしくお願いします 的外れな回答や記述などがあればお叱りいただきたく |