0

外部コントローラー (Arduino) を使用して送信されるシリアル ポートからテキスト コマンドを読み取る Visual Basic でプログラムを作成しています。ただし、コードをテストしようとすると、エラーが発生します。

クロススレッド操作が無効です

コードは次のようになります。

 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イベントは通常、あなたが思っているようには機能せず、コードがイベントで実行されている間、シリアルポートをブロックする可能性があることがわかりました。

私の好みは、Timer1秒あたり5回などの妥当な速度で実行されるフォームにを追加することです。

タイマーOnTickイベントでSerialPort1.BytesAvailableは、データが到着したかどうかをテストできます。次にReadExisting()、上記のように使用します。

タイマーコードは、クロススレッドの問題が発生しにくくなります。

于 2012-12-09T22:45:25.213 に答える
0

Cross-thread operation not validおよびCross-thread operation not valid: コントロールが作成されたスレッド以外のスレッドからアクセスされるを参照してください。

簡単な答え: 非 UI (メイン) スレッドで許可されていない UI 操作を実行します。

VB.NET では次のようになります。

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