2012-12-20 58 views
2

我在使用C#打開串口時遇到了這個問題(應該很簡單;或者我認爲)。訪問串口時信號量超時?

當我試圖打開一個串口,我收到以下異常:

信號燈超時期限已過

這裏是這樣做的方法。

public static void Open_TheActivePortWeWillUse(String Drone_StringNameFromUser) 
{ 
    var TempSerialPort = new SerialPort (
     Drone_StringNameFromUser, 
     (int) SerialPortParameter.TheSerialPortSpeed); 

    // Now we have a name that anybody can see and use 
    OurSpecificPorts.TheActivePortWeAreUsing = TempSerialPort;  
    // We'll do 8-N-1 since almost the whole planet does that 
    OurSpecificPorts.TheActivePortWeAreUsing.DataBits = 8; 
    // We'll do 8-N-1 
    OurSpecificPorts.TheActivePortWeAreUsing.Parity = Parity.None;  
    // We'll do 8-N-1 
    OurSpecificPorts.TheActivePortWeAreUsing.StopBits = StopBits.One;  

    OurSpecificPorts.TheActivePortWeAreUsing.DataReceived +=  
     OurBackGroundSerialPortReceiver; 
    // We can now open our active port, which is what this line does 
    OurSpecificPorts.TheActivePortWeAreUsing.Open();  
} 

對我來說最奇怪的是我得到這個錯誤不一致。 它的一半時間工作好吧,另一半,它不是

有人看到我的代碼顯然有什麼問題嗎?我錯過了什麼嗎?

回答

2

在方法內部聲明SerialPort對象將不允許在方法關閉後訪問它。下面是工作打開端口的方法:

private void OpenSerialPort(String portName) 
    { 
     try 
     { 
      serialPort1.Close(); 
      serialPort1.PortName = portName; 
      serialPort1.BaudRate = 115200; 
      serialPort1.DataBits = 8; 
      serialPort1.Handshake = Handshake.None; 
      serialPort1.Parity = Parity.None; 
      serialPort1.RtsEnable = false; 
      serialPort1.StopBits = StopBits.One; 

      serialPort1.Open(); 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Could not open serial port " + portName, "Error"); 
     } 
    } 

一個串口對象是在類中聲明:

namespace Arcadia 
{ 
    public partial class Form1 : Form 
    { 
     private SerialPort serialPort1; 

而且回調是在構造函數中添加:

public Form1() 
    { 
     InitializeComponent(); 

     serialPort1.DataReceived += new SerialDataReceivedEventHandler(this.SerialPortReadCallback); 

發送數據的方式不同:

private void SerialPortWrite(String writeString) 
    { 
     if (serialPort1.IsOpen) 
     { 
      serialPort1.WriteLine(writeString); 
     } 
    } 

這裏是收到的數據回調:

private void SerialPortReadCallback(object sender, SerialDataReceivedEventArgs args) 
    { 
     try 
     { 

      while (serialPort1.BytesToRead > 0) 
      { 
       // Do something with the data 

      } 
     } 
     catch (Exception ex) 
     { 
     } 
    } 
+0

怎麼樣SerialDataReceivedEventHandler?我在類中聲明它,並使用類中的方法發送數據。這是行得通的;我已確認。我對我所做的任何事情都很感興趣,以後可能會再來咬我。感謝您的輸入。那麼,在您的示例中,serialPort1將在整個應用程序中可見且可用於所有方法? –

+0

我編輯了包含初始化,發送和接收方法的答案。在我的示例中,是的,serialPort1可用於類(Form1)中的所有方法。它不適用於其他類。 –