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

タイトル 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

これのリアルタイムでの受信バージョンができれば良いのですが・・・ご指導をよろしくお願いします

的外れな回答や記述などがあればお叱りいただきたく

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

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