2010-04-08 73 views
1

我正在使用串口接收消息。下面的函數在一個線程中運行。當我調試我發現線程正常運行。但是「if(sp.IsOpen)」總是假的,因爲代碼在IF條件內根本不執行。它說港口已關閉。從串口接收消息的線程不能使用c#

我將在我的系統中有多個串行端口,我不知道哪個端口將收到消息。所以我需要聽一個線程中的所有端口。

我該如何解決我的問題?

private void ListenerPorts() 
    { 

     log.Info("Listening Thread Started"); 

     while (true) 
     { 
      //foreach (SerialPort sp in storeport) 
      foreach (SerialPort sp in comPortsList) 
      { 

       if (sp.IsOpen) 
       { 
        sp.ReadTimeout = readTimeoutInMs; 
        sp.WriteTimeout = writeTimeoutInMs; 

        try 
        { 
         string msg = sp.ReadLine(); 
         this.GetMessageRichTextBox("Message : " + msg + "\n"); 
         sp.WriteLine(sp.PortName); 

         if (msg.Contains("COM")) 
         { 
          // is AutoScan 
          receiverPortName = sp.ReadLine(); 
          this.updateLblStatusRichTextBox(sp.PortName + " is connected to " + msg + "\n"); 
         } 
         else 
         { 
          //standalone is uppercase 
          ReceiverPortName = sp.ReadLine(); 
          this.updateLblStatusRichTextBox(sp.PortName + " is connected to " + ReceiverPortName + "\n"); 

         } 
        } 

        catch (Exception ex) 
        { 
         // no data 
         System.Diagnostics.Debug.WriteLine(sp.PortName + " : " + ex.Message); 

        } 
       }   
      } 
     } 
    } 

回答

0

你的串口初始化代碼在哪裏?特別是行SerialPort.Open();

在使用

SerialPort.DataReceived += 
    new SerialDataReceivedEventHandler(SerialDataReceivedEventHandler); 

從他們那裏收到的數據,而不是看看。

+0

那麼,是否意味着我需要打開系統中用於接收消息的所有端口? – Anuya 2010-04-08 07:26:40

+1

是的。請參閱http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.open.aspx – 2010-04-08 15:25:21

+1

您可以使用每個端口的單獨線程(而不是DataReceived事件處理程序),但是您可以仍然需要打開端口才能使用它。 – 2010-04-08 15:27:01