2012-01-26 48 views
1

有關Arduino板和c#winforms應用程序之間通信的快速問題。基本上我到目前爲止所做的是類似於串行通信在後臺線程

_serialPort = new SerialPort(); 
... 
_serialPort.Open(); 
... 
_serialPort.DataReceived += OnReceived; 
... 
private static void OnReceived(object sender, SerialDataReceivedEventArgs c) 
{ 
// Do something 
} 

只要我把它放在應用程序的主線程中,我的問題是可以編寫一個類,它與上面的代碼(通過串口通信)在後臺線程中執行相同的操作。

+2

應該工作,什麼打破當你這樣做? –

+0

這樣做沒什麼意義,DataReceived已經在一個線程上運行。其他代碼不需要花費任何東西。 –

+0

據我所知,如果您事先知道SerialPort(com,baudrate,buffersize)的設置,這可以正常工作。我更喜歡以下內容: - 顯示主窗體 - 編輯設置 - 點擊按鈕和連接 – JonBlumfeld

回答

4

只要SerialPort被實例化並且所有的事件和操作都發生在後臺線程上只有,您可能可以。

從MSDN:

任何公共靜態此類型的成員(在Visual Basic中的Shared)都是線程安全的。任何實例成員不保證是線程安全的。

所以這個類不是「線程安全」的,所以試圖以多線程的方式做任何事情都不是一個好主意。

1

我認爲這是行不通的,因爲你的OnReceived方法試圖將某些東西寫入GUI控件(例如TextBox)。

這是失敗的部分,而不是接收數據本身。如果您想在此方法內訪問GUI線程,您應該在所需的控件上調用[Invoke()][1]BeginInvoke()並將您的代碼放入給定的lambda中。

對於更高級的東西,你也可以考慮使用ReactiveExtensions和ObserveOn()方法。

1

我有一個答案:

public delegate void DisplayInfoSentDelegate(byte[] abyBuf); 

private void SendThread(_dlg pThis, byte[] abyBuf, int iNumOfBytes) 
{ 
    ... 
    pThis.Invoke(new DisplayInfoSentDelegate(DisplayInListBox), new object[] { abyBuf}); 
}