C# Windows:启动时是否有东西临时占用com端口?
我有一个WPF/C应用程序,它是作为Windows嵌入式标准机器上“启动”组的一部分启动的。应用程序要做的第一件事(在其静态app()方法中)是为COM1创建一个新的SerialPort对象。COM1是一个硬接线串行端口,不是USB虚拟端口或类似的东西 我的问题是,在启动时,我经常(可能是12个中的1个)会遇到一个例外: System.UnauthorizedAccessException:拒绝访问端口“COM1” 没有其他应用程序使用此端口。此外,当我在出现此错误后重新启动应用程序时,它会很好地抓取端口。有时我的应用程序的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” 没有其他应用程序使用此端口。此外,当我在出现此错误后重新启动应用程序时,它会很好
更新:我添加了对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;//只有在没有异常的情况下才能到达这里
}
捕获(未经授权的访问例外)
{
//记录,关闭,然后重试
如果(端口打开尝试次数+++