1

我是这个论坛的新手,所以我不确定这是否真的是放置这个的地方 - 如果需要,请随时移动到更合适的论坛。


好的,所以我正在 VB 2010 中编写一个简单的应用程序,将 HEX 数据发送和接收到串行设备。现在我已经完成了“发送”部分,但是,我在接收部分遇到了困难。设备每秒将恒定的 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 !!!??”。

感谢您提供任何帮助。:)


编辑 - 发送数据的代码:

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

避免考虑“十六进制”数据,因为十六进制只是将二进制数据格式化为易于人类阅读的字符串的一种方式。

显然,您的设备使用的是二进制协议;您的 Click 事件处理程序就是证明。这总是意味着它还返回二进制数据,而不是文本。这使得使用 SerialPort.ReadExisting() 错误,读取文本。结果就是你现在看到的垃圾,尤其是问号。产生这些是因为它不知道如何将接收到的字节转换为 ASCII 字符。

您必须改为使用 SerialPort.Read() 来填充 Byte()。一定要注意Read()的返回值;这告诉你你有多少字节。结果将小于您要求的字节数。继续调用 Read() 直到您根据协议规则从设备获得完整响应。

获得完整响应后,您可以使用设备返回的数据对其进行处理。在 RichTextBox 中显示它并不是非常有用,除了用于调试目的。您可以使用 BitConverter.ToString(Byte()) 重载从字节生成十六进制字符串。请务必在 DataReceived 事件处理程序中使用 Control.BeginInvoke(),因为您无法直接更新 UI,因为该事件在工作线程上运行。

如果您需要有关协议规则的帮助,请联系设备供应商以获得支持。

于 2012-10-25T11:30:33.627 回答