我知道DataReceived event是在後臺線程上觸發的。如何告訴GUI線程在事件處理程序中顯示數據?如何使用DataReceived事件在.Net中使用SerialPort?
3
A
回答
1
此代碼假定您已添加表單級SerialPort
對象,其DataReceived
事件附帶port_DataReceived
方法,並且您的表單上有一個名爲label1
的標籤。
對於將端口中可用字節轉換爲字符串的代碼,我並不是100%確定的,因爲我沒有在收集數據的實時串行端口上運行此代碼。但是這段代碼將允許您顯示接收到的數據,而不管事件是否在不同的線程中。
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort)sender;
byte[] buffer = new byte[port.BytesToRead];
port.Read(buffer, 0, buffer.Length);
string data = UnicodeEncoding.ASCII.GetString(buffer);
if (label1.InvokeRequired)
{
Invoke(new EventHandler(DisplayData), data, EventArgs.Empty);
}
else
{
DisplayData(data, EventArgs.Empty);
}
}
private void DisplayData(object sender, EventArgs e)
{
string data = (string)sender;
label1.Text = data;
}
1
您可以在窗體上使用IsInvokeRequired and BeginInvoke方法將控件切換回UI線程。
在某些情況下,我還使用計時器來監視某些共享數據結構(如消息列表)中的更改。但是,當你從後臺線程獲得相當穩定的消息流時,效果最好。
相關問題
- 1. .NET SerialPort DataReceived事件未觸發
- 2. .Net SerialPort Readline與DataReceived事件處理程序
- 3. 如何等待BackgroundWorker中的SerialPort DataReceived事件處理程序
- 4. SerialPort類和DataReceived事件...獲取字節。使用ReadLine還是ReadExisting?任何例子?
- 5. 的SerialPort單聲道在linux不響應DataReceived事件檢索
- 6. 如何使用SerialPort管理事務?
- 7. C#SerialPort DataReceived不更新主UI的事件
- 8. 發送數據後發送SerialPort DataReceived事件
- 9. 繼承SerialPort並手動觸發DataReceived事件
- 10. 如何使用端口datareceived事件連接mysql數據庫
- 11. 如何在Rust中使用serialport?
- 12. 如何在C#中使用串口端口對象的dataReceived事件?
- 13. SerialPort C#自定義DataReceived委託
- 14. serialport dataReceived事件和線程問題導致凍結C#中的窗體#
- 15. 使用的SerialPort
- 16. 如何使用.NET/C#進行健壯的SerialPort編程?
- 17. C#Serial DataReceived事件不足
- 18. c#SerialPort WriteTimeout使用?
- 19. 如何在.NET中使用LinkLabels的ArrayList創建LinkClicked事件
- 20. 如何在Gecko Webbrowser中使用DocumentComplete事件c#/ .net
- 21. 如何在c#中使用插件.net
- 22. 如何使用的SerialPort VB6的
- 23. 如何更可靠地使用SerialPort類
- 24. 如何使用SerialPort SerialDataReceived幫助
- 25. 在Windows 10上使用USB調制解調器的.NET SerialPort類
- 26. 如何在onmouseleave事件中使用RGBA?
- 27. 如何在Ext.Message.Box中使用keydown事件
- 28. 如何使用事件在Flex中
- 29. 如何在ViewModel中使用RadDragAndDrop事件
- 30. 如何在AngularJS中使用jsTree事件