2010-04-23 73 views

回答

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線程。

在某些情況下,我還使用計時器來監視某些共享數據結構(如消息列表)中的更改。但是,當你從後臺線程獲得相當穩定的消息流時,效果最好。

相關問題