我正在尝试制作一个可以从串行端口读取 12 字节十六进制字符串并将其显示到文本框中的应用程序,源是使用 RS232-USB 转换器连接到我的 USB 端口的 RFID 模块。
我的第一个问题是由于无效的跨线程操作而访问 datarecieved 事件中的文本框。在谷歌上搜索后,我复制/粘贴了让它工作所需的代码,这些都是跨线程函数。
OpenPort 函数和 Datarecieved 事件是我自己的代码,其余的我从谷歌上下来。
然后应用程序工作了,但我会得到一个不完整的代码,第一次滑动我会得到所有 12 位数字,并且每隔一次滑动,第一个字节就会消失。在阅读更多内容后,我决定创建一个数组,即传入数据的大小(如下面的代码所示),但现在我再次遇到跨线程错误。
我知道我使用数组的方式有问题。这超出了我的 VB 知识范围,我在这里不知所措,可以使用一些专家帮助。我是一名电子工程师,并且自学了一点编程来为我的硬件创建一些应用程序。
谢谢。
更新代码:
Public Class Form3
Dim msg As String
Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For Each s In System.IO.Ports.SerialPort.GetPortNames()
lstPorts.Items.Add(s)
Next s
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If lstPorts.SelectedIndex = -1 Then
MessageBox.Show("Please select a port")
Exit Sub
Else
SerialPort1.BaudRate = 9600
SerialPort1.DataBits = 8
SerialPort1.Parity = IO.Ports.Parity.None
SerialPort1.StopBits = IO.Ports.StopBits.One
SerialPort1.PortName = lstPorts.SelectedItem.ToString
SerialPort1.Open()
End If
End Sub
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
msg = SerialPort1.ReadExisting
Me.Invoke(New Action(
Sub()
txtReceived.Clear()
txtReceived.Text += msg
End Sub))
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
SerialPort1.Close()
txtReceived.Text = ""
End Sub
End Class