1

私はこのフォーラムを初めて使用するので、これが本当にこれを投稿する場所かどうかわかりません。必要に応じて、より適切なフォーラムに自由に移動してください。


わかりましたので、VB 2010 でシリアル デバイスとの間で HEX データを送受信する簡単なアプリケーションを作成しています。これで、「送信」部分はうまくいきましたが、受信部分に問題があります。デバイスは、1 秒ごとに HEX データの一定のストリームをアプリケーションに送り返します。受信した HEX 文字列の特定のバイトを調べ、それに応じて IF ステートメント内で処理を行うアプリケーションが必要です (たとえば、文字列のバイト 10 が "&10" と等しい場合は ... を実行します)。

このデータを取得し、そこから正しいバイトを解析して、何かを行う方法がわかりません。:/ これに使用しようとしたコード (ただし動作​​しません) は次のとおりです:-

Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As     System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
       Dim statusget() As String
       Dim str1 As String
       str1 = SerialPort1.ReadExisting()
       statusget = str1.Split(",")

    If statusget(10) = "&01" Then
        btn_tx1.BackColor = Color.Red
        btn_tx2.BackColor = SystemColors.Control
        btn_tx3.BackColor = SystemColors.Control
        btn_tx4.BackColor = SystemColors.Control
        btn_tx5.BackColor = SystemColors.Control
        btn_tx6.BackColor = SystemColors.Control
        btn_tx7.BackColor = SystemColors.Control
        btn_tx8.BackColor = SystemColors.Control
    End If
End Sub

さらに、デバイスから受信したすべてのデータを表示するリッチ テキスト ボックスがあるので、それを監視できます。「uZ!!!??」のような奇妙なエンコーディング (HEX ではない) で返されるという事実を除いて、正常に動作します。

ご協力いただきありがとうございます。:)


編集 - データを送信するためのコード:

Private Sub btn_tx1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_tx1.Click
    Dim buftx1() As Byte = {&HF0, &H5A, &HF, &H5, &H1, &H11, &H0, &H0, &H0, &H0, &H0, &H0, &H30, &H37, &HFF}
    SerialPort1.Write(buftx1, 0, buftx1.Length)
End Sub
4

1 に答える 1

1

16 進数はバイナリ データを人間が読みやすい文字列にフォーマットする方法にすぎないため、「16 進数」データについて考えないようにしてください。

明らかに、デバイスはバイナリ プロトコルを使用しています。Click イベント ハンドラーがその証拠です。これは常に、テキストではなくバイナリ データも返すことを意味します。SerialPort.ReadExisting() の使用が間違っているため、テキストを読み取ります。その結果、あなたが今目にしているゴミ、特にクエスチョン マークが生まれます。これらは、受信したバイトを ASCII 文字に変換する方法がわからないために生成されます。

代わりに、SerialPort.Read() を使用して Byte() を埋める必要があります。Read(); の戻り値に注意してください。これは、取得したバイト数を示しています。結果は、要求したバイト数よりも少なくなります。プロトコル ルールに従ってデバイスから完全な応答が得られるまで、Read() を呼び出し続けます。

完全な応答を取得したら、デバイスから返されたデータを使用して処理できます。これを RichTextBox に表示しても、デバッグ目的以外ではあまり役に立ちません。BitConverter.ToString(Byte()) オーバーロードを使用して、バイトから 16 進文字列を生成できます。イベントはワーカー スレッドで実行されるため、UI を直接更新することはできないため、必ず DataReceived イベント ハンドラーで Control.BeginInvoke() を使用してください。

プロトコル ルールについてサポートが必要な場合は、デバイスのベンダーにお問い合わせください。

于 2012-10-25T11:30:33.627 に答える