从SerialPort.Read()获取跨线程操作无效

时间:2012-12-09 20:49:21

标签: vb.net exception-handling serial-port arduino

我正在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

2 个答案:

答案 0 :(得分:0)

请参阅Cross-thread operation not validCross-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()

定时器代码不太容易出现跨线程问题。