Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows:启动时是否有东西临时占用com端口?_C#_Wpf_Exception_Serial Port_Startup - Fatal编程技术网

C# Windows:启动时是否有东西临时占用com端口?

C# Windows:启动时是否有东西临时占用com端口?,c#,wpf,exception,serial-port,startup,C#,Wpf,Exception,Serial Port,Startup,我有一个WPF/C应用程序,它是作为Windows嵌入式标准机器上“启动”组的一部分启动的。应用程序要做的第一件事(在其静态app()方法中)是为COM1创建一个新的SerialPort对象。COM1是一个硬接线串行端口,不是USB虚拟端口或类似的东西 我的问题是,在启动时,我经常(可能是12个中的1个)会遇到一个例外: System.UnauthorizedAccessException:拒绝访问端口“COM1” 没有其他应用程序使用此端口。此外,当我在出现此错误后重新启动应用程序时,它会很好

我有一个WPF/C应用程序,它是作为Windows嵌入式标准机器上“启动”组的一部分启动的。应用程序要做的第一件事(在其静态app()方法中)是为COM1创建一个新的SerialPort对象。COM1是一个硬接线串行端口,不是USB虚拟端口或类似的东西

我的问题是,在启动时,我经常(可能是12个中的1个)会遇到一个例外: System.UnauthorizedAccessException:拒绝访问端口“COM1”

没有其他应用程序使用此端口。此外,当我在出现此错误后重新启动应用程序时,它会很好地抓取端口。有时我的应用程序的com端口好像还没有准备好/设置好

我对这件事一无所知!任何洞察都将不胜感激


更新:我添加了对SerialPort.GetPortNames()的调用,并在尝试打开端口之前打印出所有可用端口。在故障情况下,COM1确实存在!所以,并不是说端口没有准备好。看起来Windows中的某些东西实际上正在临时获取端口并阻止我。

微软的一些响应者似乎认为内核在启动时出于调试原因临时获取COM1。他们说最好的方法是从根本上解决这个问题。。。捕获异常并重试。呜呜

我修改了代码,在放弃之前重试打开端口几次,这似乎解决了这个问题

旧代码:

_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);
                    }
                }
            }
const int PORT\u OPEN\u MAX\u尝试次数=10;
bool-portOpened=false;
int-portOpenAttempts=0;
_端口=新的串行端口(端口,9600,奇偶校验。无,8,停止位。1);
当(!端口已打开)
{
尝试
{
_port.Open();
portOpened=true;//只有在没有异常的情况下才能到达这里
}
捕获(未经授权的访问例外)
{
//记录,关闭,然后重试
如果(端口打开尝试次数+++