2012-03-29 26 views
-1

嗨,我在這裏有一個簡單的程序,但它不能正常工作。
當我在串口上收到'A'時,我設置了checkbox1,當'a'我取消設置checkbox1。串口簡單

public partial class MainWindow : Window 
    { 
     public static SerialPort sp = new SerialPort(); 
     public MainWindow() 
     { 
      InitializeComponent(); 
      sp.BaudRate = 2400; 
      sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Prijem); 
      if (!sp.IsOpen) 
       sp.Open();    
     } 

     private delegate void UpdateUiTextDelegate(char text); 
     private void Prijem(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
     {    
      char c = (char)sp.ReadChar(); 
      Dispatcher.Invoke(DispatcherPriority.Send, 
       new UpdateUiTextDelegate(WriteData), c); 
     } 

     private void WriteData(char c) 
     { 
      if (c == 'A') 
      { 
       checkBox1.IsChecked = true; 
      } 
      else if (c == 'a') 
      { 
       checkBox1.IsChecked = false; 
      } 
     } 
    } 
+0

究竟發生了什麼?你能確認WriteData()是否正在被一個斷點調用嗎?你能否確認你實際上在端口上收到任何數據? – JTeagle 2012-03-29 12:47:35

+0

您還沒有分配任何端口號。 – ABH 2012-03-29 12:49:22

回答

1

當引發DataReceived事件時,不能保證緩衝區內有多少個字符。所以如果你只是打電話ReadChar()你不會讀取緩衝區的全部內容。因此,如果字符發送速度很快,那麼您可能會錯過某些內容,導致您的事件處理程序在兩個或更多個字符位於緩衝區內時被調用。

你也應該設置所有串口屬性,而不只是波特率。這是必需的,因爲串行端口沒有默認狀態並且將保持每個參數的最後一個設置選項。所以如果你使用一些終端程序來改變一些較小的使用設置(比如Xon/off,HW Handshake,StartBits等),如果你沒有將它們重置爲你想要的值,你的程序將簡單地使用相同的設置。

1

SerialPort屬性並未全部設置。分配端口號。