2012-12-20 2 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 개체에 대한 액세스 권한을 허용하지 않습니다 선언. 하여 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)의 모든 메소드에서 사용할 수 있습니다. 다른 클래스에서는 사용할 수 없습니다. –

관련 문제