2012-12-09 79 views
0

我正在使用Visual Basic編寫一個程序,它將從串口讀取使用外部控制器(Arduino)發送的文本命令。然而,當我嘗試測試代碼中,我得到一個錯誤:通過SerialPort.Read()獲取跨線程操作無效無效

Cross-thread Operation Not Valid

下面是代碼的樣子:

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

可能重複的[跨線程操作無效](http://stackoverflow.com/questions/5037470/cross-thread-operation-not-valid) – abatishchev

+0

DataReceived事件在工作線程上運行,您無法更新任何控制直接。使用關於此異常的*數百個以前的問題來查找解決方案。 –

回答

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) 
+0

我讀過,但仍然沒有完全理解如何實現我的代碼,因爲這不是視覺基礎。我對此很陌生,你對我如何去做這件事有所瞭解嗎? – user1683391

+0

@ user1683391:請參閱http://msdn.microsoft.com/en-us/library/bb531253.aspx和http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx – abatishchev

+0

@ user1683391:查看已更新回答。 – abatishchev

0

我發現,DataReceived事件通常不工作,你的想法和代碼,而在運行時可以阻止串行端口。

我的首選是將Timer添加到以合理的速度運行的窗體,例如每秒5次。

在計時器OnTick事件中,您可以測試SerialPort1.BytesAvailable以查看數據是否已到達。然後像上面那樣使用ReadExisting()

計時器代碼將不太容易出現交叉線程問題。