簡體   English   中英

如何使用DataReceived事件在.Net中使用SerialPort?

[英]How to use SerialPort in .Net by using DataReceived event?

我知道DataReceived事件是在后台線程上觸發的。 如何告訴GUI線程在事件處理程序中顯示數據?

您可以使用窗體上的IsInvokeRequired和BeginInvoke方法將控件切換回UI線程。

在某些情況下,我還使用計時器來監視某些共享數據結構中的更改,例如消息列表。 但是當你從一些后台線程得到一個非常穩定的消息流時,這種方法效果最好。

此代碼假定您已添加了一個表單級SerialPort對象,其port_DataReceived方法附加到其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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM