当前位置: 首页 > 编程语言 > C#

SerialPortUnauthorizedAccessException分享

时间:2023-04-10 17:49:52 C#

SerialPortUnauthorizedAccessException有时我的一些集成测试失败并出现上述消息。我正在使用下面的代码来准备端口。for(inti=0;i<5;i++){try{port.Open();如果(port.IsOpen)中断;}catch(Exceptione){try{port.Close();}赶上(异常){}Thread.Sleep(300);我的假设是,因为它不能阻塞端口的当前线程(因为它会尝试关闭它),它一定是另一个没有正确清理的线程或进程(在其他测试之后-没有其他访问权限)这个端口)。有没有办法重置SerialPort的状态,以便新的线程/进程可以再次访问它?谢谢,Richard这是SerialPort类中的一个缺陷,它使用内部辅助线程来等待端口上的事件。DataReceived、PinChanged和ErrorReceived事件的来源。该缺陷存在于Close()方法实现中,它不等待工作线程终止。这需要时间,确切的时间量是不可预测的,当机器特别忙时可能需要很多秒。在这种情况发生之前,物理端口不会关闭,在线程退出炸弹之前打开端口并使用“端口已在使用”异常。你得到的那个。所以睡眠300毫秒是不够的。这通常不是问题,串行端口不是可共享设备。关闭串口而不退出程序是危险的,另一个进程可能会窃取端口。当您尝试再次打开它时,它也会给您这个异常。通常的做法是在应用程序启动时打开端口,而不是在应用程序终止之前关闭它。我经常在实例化串口之前验证端口是否关闭。如果您在不关闭串行端口的情况下停止调试代码,这将会有所帮助您应该在打开或关闭端口后等待250毫秒,然后再继续执行代码。尝试{if((m_SerialPort!=null)){if(m_SerialPort.IsOpen){m_SerialPort.Close();}}m_SerialPort=newSerialPort(portName,dataRate,parity,databits,stopBits.One);m_SerialPort.Open();if(!m_SerialPort.IsOpen){MessageBox.Show(string.Concat(portName,"打开失败"));}}catch(Exceptionex){MessageBox.Show(ex.Message);}我看不到你关闭端口的位置。对我来说问题不在这里(即使你应该重构你的代码),但可能你正在调用port.Open();当端口仍然打开时来自MSDN每个SerialPort对象只能存在一个打开的连接。(我不能告诉你为什么,因为我没有足够的信息)还要记住,close方法需要一些时间来实际关闭端口,实际上你应该阻塞主线程直到端口关闭(可能使用Thread.join)来自MSDNforanyapplication最佳实践是在尝试调用Open方法之前等待一段时间后再调用Close方法,因为端口可能不会立即关闭。了解更多http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.open.aspx应该调用GC.SuppressFinalize和GC.ReRegisterForFinalize,将SerialPort实例BaseStream属性作为参数传递,而不仅仅是串行端口实例。以上就是C#学习教程:SerialPortUnauthorizedAccessException分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: