2010-04-29 69 views
0

我有一个WPF/C#应用程序作为Windows Embedded Standard机器上的“启动”组的一部分启动。应用程序所做的第一件事情(在其静态App()方法中)是为COM1创建一个新的SerialPort对象。 COM1是一个硬连线串行端口,不是USB虚拟端口或类似的东西。Windows:在启动时是否暂时获取com端口?

我的问题是,在启动时每隔一段时间(可能是12),我会得到一个异常: System.UnauthorizedAccessException:拒绝访问端口'COM1'。

使用此端口没有其他应用程序。另外,当我在这个错误之后重新启动应用程序时,它抓住端口就好了。就好像com端口有时候还没有准备好/设置为我的应用程序。

我对此一无所知!任何见解都被赞赏!

UPDATE:我在尝试打开端口之前添加了对SerialPort.GetPortNames()的调用并打印出所有可用的端口。在失败的情况下,COM1确实存在!所以,这并不是港口没有准备好。它看起来像Windows中的某个东西实际上是暂时抓住端口并阻止了我。

回答

1

微软的一些响应者似乎认为内核在调试时暂时在启动时抓取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); 
        } 
       } 
      }