2013-07-28 21 views
0

我每次從串口獲得兩個字節並找到它們之間的差異,然後在一個while循環中創建一個wpf,並在其中顯示差異通過一個文本框:在startbutton_Click()函數內的while循環中接收串口數據

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

    } 
    SerialPort port; 
    private void StartButton_Click(object sender, RoutedEventArgs e) 
    { 
     port = new SerialPort("COM3"); 
     port.BaudRate = 9600; 
     port.DtrEnable = true; 
     port.RtsEnable = true; 
     port.Handshake = Handshake.None; 
     port.Open(); 
     try 
     { 
      if (!port.IsOpen) 
       throw new Exception(); 
     } 
     catch (Exception) 
     { 
      Console.Out.WriteLine("port is not open!!"); 
     } 
     while (port.IsOpen) 
     { 
      var b1 = port.ReadByte(); 
      var b2 = port.ReadByte(); 
      double t1 = b1 * 1e-9; 
      double t2 = b2 * 1e-9; ; 
      var dift = t2 - t1; 
      if (dift == 0) 
      { 
       this.SpeedTextBox.Text = "0"; 
       continue; 
      } 
      this.SpeedTextBox.Text = dift; 
     } 
    } 

    private void StopButton_Click(object sender, RoutedEventArgs e) 
    { 
     if (port != null) 
     { 
      if (port.IsOpen) port.Close(); 
      port.Dispose(); 
     } 
    } 
} 

但是當我執行它,然後單擊StartButton表格將被採空working.I知道程序接收到的數據(我用另一種簡單的程序測試過)。但我不知道這裏出了什麼問題!

任何人都可以幫助我嗎?

在此先感謝。

回答

2

ReadByte()是一種阻塞方法,直到收到一個字節纔會返回。這就是爲什麼SerialPort具有DataReceived事件的原因。

首先使用另一個程序,如超級終端或膩子來測試連接,並消除簡單的錯誤,如接線不良,挑錯端口號或波特率,並獲得錯誤的Parity,DataBits和StopBits設置。你沒有設置,所以有非零的機率,你會得到框架錯誤。您必須實施ErrorReceived事件以確保這些類型的錯誤不會被忽視,並讓您感到困惑爲什麼它不起作用。

如果您不使用DataReceived,那麼使用ReadTimeout屬性以確保您的程序不會永久掛起,而且在連接出現問題時無法診斷原因。準備好趕上TimeoutException。

SysInternals的PortMon是一個非常有用的實用程序來比較好與壞,它顯示了串口驅動程序內到底發生了什麼。但請注意,它不適用於64位操作系統。

0

Hans已經涵蓋了串口案例,但是你的程序鎖定的另一個原因是你的點擊處理程序使用了無限的等待循環。 Windows應用程序的工作方式是它們有一個從隊列中獲取消息(如單擊事件)的主循環。對於每條消息,您的事件處理程序都會被調用,並且只有當您的事件處理程序將控制權返回給主循環時才能處理下一條消息(例如,重新繪製窗口並顯示您在控件上設置的新文本)。因此,如果您希望程序對用戶輸入保持響應,則無法在事件處理程序中使用長循環或阻止呼叫。

+0

很好的答案,但你忘了提及你如何解決這個問題。 –

+0

是真的。我期待其他人使用BeginRead()提供異步通信的描述,因爲我很難通過手機發布正確的代碼示例。讀者請執行以下操作:調查SerialPort.BeginRead() –