我是这个论坛的新手,所以我不确定这是否真的是这个地方 - 如果需要,请随意转到更合适的论坛。
好的,我正在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
此外,我有一个富文本框,显示从设备收到的所有数据,以便我可以监控它。它运行正常,除了它以奇怪的编码(不是HEX)返回,例如“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
答案 0 :(得分:1)
避免考虑“十六进制”数据,因为十六进制仅仅是一种将二进制数据格式化为易于人类阅读的字符串的方法。
显然,您的设备正在使用二进制协议;您的Click事件处理程序就是证明。这总是意味着它也返回二进制数据,而不是文本。这使得使用SerialPort.ReadExisting()错误,读取文本。结果就是你现在看到的垃圾,特别是问号。产生它们是因为它不知道如何将它接收的字节转换为ASCII字符。
您必须使用SerialPort.Read()来填充字节()。一定要注意Read()的返回值;它告诉你你有多少字节。结果将小于您要求的字节数。继续调用Read(),直到根据协议规则从设备获得完整响应。
获得完整响应后,您可以使用设备返回的数据对其进行处理。除了用于调试目的之外,在RichTextBox中显示它并不是非常有用。您可以使用BitConverter.ToString(Byte())重载从字节生成十六进制字符串。请务必在DataReceived事件处理程序中使用Control.BeginInvoke(),因为由于事件在工作线程上运行,因此无法直接更新UI。
如果您需要有关协议规则的帮助,请与设备供应商联系以获取支持。