2010-04-29 19 views
0

Windows Embedded Standard 컴퓨터에서 "시작"그룹의 일부로 시작되는 WPF/C# 응용 프로그램이 있습니다. App (정적 App() 메소드에서)이 수행하는 첫 번째 작업 중 하나는 COM1에 대한 새로운 SerialPort 객체를 만드는 것입니다. COM1은 USB 가상 포트가 아닌 직접 연결된 직렬 포트입니다.Windows : 시작시 뭔가가 일시적으로 COM 포트를 점유합니까?

내 문제는 시작시 12 분의 1에 해당하는 경우가 종종 발생하므로 예외가 발생합니다. System.UnauthorizedAccessException : 'COM1'포트에 대한 액세스가 거부되었습니다.

이 포트를 사용하는 다른 응용 프로그램은 없습니다. 또한,이 오류 다음에 응용 프로그램을 다시 실행하면 포트가 제대로 작동합니다. 마치 COM 포트가 내 앱을 위해 준비/설정되지 않은 것처럼 보입니다.

나는 이것에 관해서 단서가 없다! 모든 통찰력은 높이 평가됩니다!

업데이트 : 포트를 열려고 시도하기 전에 SerialPort.GetPortNames()에 대한 호출을 추가하고 사용 가능한 모든 포트를 인쇄합니다. 실패 사례에서는 COM1이 실제로 존재합니다! 따라서 포트가 준비되지 않았다는 것이 아닙니다. Windows에서 실제로 포트를 일시적으로 점유하고 나를 차단하는 것으로 보입니다.

답변

1

Microsoft의 응답자 중 일부는 디버그 이유로 인해 COM1이 일시적으로 COM1을 잡는다고 생각하는 것 같습니다. 그들은 최선의 접근법이 본질적으로이 문제를 해결하는 것이라고 말합니다 ... 예외를 잡아두고 다시 시도하십시오. Boooo.

포기하기 전에 몇 번 포트를 다시 열어 본 코드를 수정하여이 문제를 해결할 수 있습니다.

오래된 코드 :

_port = new SerialPort(port, 9600, Parity.None, 8, StopBits.One);         
_port.Open(); // This can throw an exception 

새로운 코드 :

const int PORT_OPEN_MAX_ATTEMPTS = 10; 
bool portOpened = false; 
int portOpenAttempts = 0;      

      _port = new SerialPort(port, 9600, Parity.None, 8, StopBits.One);      

      while (!portOpened) 
      { 
       try 
       { 
        _port.Open(); 
        portOpened = true;  // Only get here if no exception 
       } 

       catch (UnauthorizedAccessException ex) 
       { 
        // Log, close, then try again 
        if (portOpenAttempts++ < PORT_OPEN_MAX_ATTEMPTS) 
        {      
         _logger.Debug("Port UnauthorizedAccessException. Attempt - " + portOpenAttempts); 

         Thread.Sleep(100); 
         _port.Close(); 
        } 

        else 
        { 
         throw(ex); 
        } 
       } 
      } 
관련 문제