2013-07-16 41 views
1

我有一個Arduino板,它可以通過Xbee模塊將一些傳感器讀數無線傳輸到串行USB模塊。 我寫了下面的代碼來讀取數據:WPF應用程序在從Arduino設備讀取串行數據時崩潰

public partial class Debugger : Page 
{ 
    public static string comportnum; 
    public delegate void NoArgDelegate(); 
    public static SerialPort serialX; 
    public Debugger() 
    { 
     InitializeComponent(); 
     comportnum = ""; 
    } 

    private void ActualButton_Click(object sender, RoutedEventArgs e) 
    { 
     comportnum = "COM" + comport.Text; 

     serialX = new SerialPort(comportnum); 
     serialX.BaudRate = 9600; 
     try 
     { 
      serialX.Open(); 

      serialX.DataReceived += new SerialDataReceivedEventHandler(serialX_DataReceived); 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("Houston, we have a problem."); 
      //throw; 
     } 
    } 

    void serialX_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 

     MessageBox.Show("Ping");   
     readingStuff(); 

    } 
    void readingStuff() 
    { 

     String comdata; 
     base.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, (NoArgDelegate)delegate 
     { 
      DebugWindow.Text += "Data"; 
      comdata = serialX.ReadLine(); 
      DebugWindow.Text += "\n" + comdata + "\n"; 
     }); 
    } 

} 

這隻要我有工作MessageBox.Show(「中國平安」)。沒有它,該應用程序凍結/崩潰。當它凍結/崩潰時,沒有運行時錯誤。即使在調試時,Visual Studio也會繼續運行,但是我無法點擊WPF應用程序的任何其他按鈕,甚至無法單擊WPF應用程序上的關閉按鈕。

我需要找出一種方法來確保數據在沒有任何中斷的情況下順利讀取,而無需使用MessageBox。

+1

您可能有一個線程問題。嘗試將串行讀取放入單獨的線程中,並在必要時應用線程間通信來更新GUI。 – Marcel

回答

2

只是一個猜測,但嘗試修改您的閱讀方法是這樣的:

void readingStuff() 
{ 
    String comdata = serialX.ReadLine(); 
    Dispatcher.Invoke((Action)(() => DebugWindow.Text += "Data\n" + comdata + "\n")); 
} 

這將異步讀取數據(調用分派前),並通過使用Invoke代替BeginInvoke也確保更新UI在讀取下一塊數據之前完成(假設SerialPort.DataReceived未被同時調用)。

+0

這就像一個魅力。非常感謝你。 –

相關問題