我非常確定只是我這樣做是錯誤的。從SerialDataReceivedEventHandler寫入文本框控件
我有Form1
有一個按鈕,onclick調用我的serialConn.cs中的一個方法,稱爲connect()
。
public static bool connect(string comPort) {
BTserial = new SerialPort(comPort, 9600, Parity.None, 8, StopBits.One);
BTserial.Open();
if (BTserial.IsOpen) {
BTserial.DataReceived += new SerialDataReceivedEventHandler(DataReceivedEvent);
return true;
} else {
return false;
}
}
private static void DataReceivedEvent(object sender, SerialDataReceivedEventArgs e) {
Debug.WriteLine("Data Incomming!");
// Check if Chars are received
if (e.EventType == SerialData.Chars) {
Debug.WriteLine("Chars!");
// Create new buffer
byte[] ReadBuffer = new byte[BTserial.BytesToRead];
// Read bytes from buffer
BTserial.Read(ReadBuffer, 0, ReadBuffer.Length);
BTserial.DiscardInBuffer();
// Encode to string
string data = bytesToString(ReadBuffer);
ReadBuffer = null;
data = null;
}
}
並且那一切都很好,但是當接收數據時,我希望它在TextBox
控制器印在我的Form1
.. 但因爲我的DataReceivedEvent()
是static
(我想我必須是?)我不能訪問任何東西? 那麼最好的方法是如何處理呢?
不確定你的意思。我在connect()方法中看到了這個想法。 但不明白:'Action toBeRunOnGuiThread =()=> this.theTextBox.Text = data; (發送者,e){'('=>'預期) – 2013-02-21 23:39:11
我很抱歉我之前犯的錯誤。再看看代碼..我錯誤地認爲連接方法是Form1類的一部分,它是一個實例方法。然後我意識到它不是該類的一部分,它屬於serialConn,它是靜態的。嘗試從按鈕的單擊事件處理程序中將Form實例(this)發送到您的connect方法。 – 2013-02-21 23:45:15
我重新編輯了整篇文章。通過行動toBeRunOnGuiThread我的意思是,實際觸摸的形式,因此它的TextBox不是你的問題的結束。您還需要以非常安全的方式執行Text屬性的更改。 SerialPort類在後臺線程上運行命令。這樣用戶界面將永遠不會凍結。用戶界面線程需要保持長時間工作狀態,以便處理鼠標點擊,而不是。但所有這一切都伴隨着一個價格。你不能修改後臺線程的用戶界面對象。你需要以某種方式發送消息 – 2013-02-21 23:45:48