2012-12-12 26 views
1

我有一個串行端口類,我想通過我的GUI控制發送/接收,並根據從串行端口(或其他事件)接收到的數據進行GUI更新。 。所以這兩個相關的類是串行類和主窗口類。在WPF GUI類中處理串行線程事件

我有下面編譯的代碼,但我嘗試運行時遇到異常。

public class MySerThread 
{ 
    public SerialPort serport; 
    public event SerialDataReceivedEventHandler newSerData; 

    public MySerThread() 
    { 
     serport = new SerialPort("COM1", 115200); 
     serport.Open(); 
     serport.DataReceived += DataReceivedHandler; 
    } 

    public void DataReceivedHandler(object s, SerialDataReceivedEventArgs e) 
    { 
     byte[] data = new byte[serport.BytesToRead]; 
     serport.Read(data, 0, data.Length); 

     // here's where I think I'm going wrong? 
     if(newSerData != null) 
      newSerData(s,e); 
    } 
} 

然後在我的GUI類...

public partial class MainWindow : Window 
{ 
    MySerThread myPort; 

    public MainWindow() 
    { 
     // Exception triggers here 
     myPort.newSerData += DisplaySerDataHandler; 
    } 

    private void DisplaySerDataHandler(object sender, SerialDataReceivedEventArgs e) 
    { 
     this.ReceivedCallback(e); 
    } 

    private void ReceivedCallback(SerialDataReceivedEventArgs e) 
    { 
     if(this.someTextBlock.Dispatcher.CheckAccess()) 
     { 
      this.UpdateTextBlock(e); 
     } 
     else 
     { 
      this.someTextBlock.Dispatcher.BeginInvoke(new Action<SerialDataReceivedEventArgs>(this.UpdateTextBlock), e); 
     } 
    } 

    private void UpdateTextBlock(SerialDataReceivedEventArgs e) 
    { 
     someTextBlock.Text = "got new data"; 
    } 
} 

那麼,我究竟做錯了什麼?做這個的最好方式是什麼?

+0

什麼是例外? –

回答

3

如果不創建實例,則無法訪問myPort。

MySerThread myPort = new MySerThread(); 
+0

我通過GUI上的按鈕創建一個實例...也許這是我的問題,是我在創建它之前訂閱事件。會嘗試。 –

+0

Doh!這似乎是我唯一的問題;現在似乎工作正常。 Jeeez。第二個問題仍然存在 - 我是否以「正確」的方式做這件事?一般來說,我對C#和GUI應用程序非常陌生。 –

+0

也許我錯了,但我會說你永遠不會在ReceivedCallback中碰到else塊,因爲UI線程擁有myPort,我看不到其他線程。我會使用較少的嵌套方法。 – LPL