我正在Visual Basic中编写一个程序,它将从串口读取使用外部控制器(Arduino)发送的文本命令。但是,当我尝试测试代码时出现错误:
跨线程操作无效
代码如下所示:
Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim Data As String = SerialPort1.ReadExisting()
If Data = "l" Then
LeftRadio.Checked = True
ElseIf Data = "r" Then
RightRadio.Checked = True
ElseIf Data = "c" Then
CenterRadio.Checked = True
End If
End Sub
Private Sub connect_Click(sender As Object, e As EventArgs) Handles connect.Click
If Not SerialPort1.IsOpen Then
SerialPort1.PortName = "COM3"
SerialPort1.Open()
End If
End Sub
答案 0 :(得分:0)
请参阅Cross-thread operation not valid和Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on
简短回答:您在非UI(主)线程中执行不允许的UI操作。
在VB.NET中应该是这样的:
Dim check = Sub()
LeftRadio.Checked = True
End Sub
LeftRadio.Invoke(check)
答案 1 :(得分:0)
我发现DataReceived
事件通常不会按您的想法运行,并且可以在代码在事件中运行时阻止串行端口。
我的偏好是在以合理的速度运行的表单中添加Timer
,例如每秒5次。
在计时器OnTick
事件中,您可以测试SerialPort1.BytesAvailable
以查看数据是否已到达。然后使用上面的ReadExisting()
。
定时器代码不太容易出现跨线程问题。