0

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

2 回答 2

0

我发现该DataReceived事件通常不会按照您的想法工作,并且可能会在事件中运行代码时阻塞串行端口。

我的偏好是以Timer合理的速度(例如每秒 5 次)运行的表单添加一个。

在 TimerOnTick事件中,您可以测试SerialPort1.BytesAvailable数据是否已到达。然后ReadExisting()像上面一样使用。

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

于 2012-12-09T22:45:25.213 回答
0

请参阅无效的跨线程操作和无效跨线程操作:控件从创建它的线程以外的线程访问

简短回答:您在不允许的非 UI(主)线程中执行 UI 操作。

在 VB.NET 中应该是这样的:

Dim check = Sub()
                LeftRadio.Checked = True
            End Sub
LeftRadio.Invoke(check)
于 2012-12-09T20:56:48.183 回答