我已经厌倦了每隔一段时间就打架一次。有问题的PC是工业触摸屏模型,永远不会改变。这个是Windows 10,而我相信它也发生在Windows 7上。虽然在过去有时这个错误涉及模拟的COM端口(即USB连接器),在这种情况下,它是一个真正的COM端口,所以我不能只需将其插入另一个,因为我使用的是232连接器。 PC可以正常工作几个月,然后有一天,COM端口出现问题,我不得不将它们随意移动,试图弄清楚哪些工作正常。当我必须远程(1000英里远)进行远程操作(有时需要将电缆插入不同位置)时,这是一个巨大的痛苦。
为了消除原始程序的任何内容,我创建了一个非常简单的测试应用程序,如下所示:
Imports System.IO.Ports
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
Try
Dim tempList As List(Of String) = SerialPort.GetPortNames.ToList
ListBox1.DataSource = tempList
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim tempPort As New SerialPort
tempPort.PortName = "COM1"
Try
tempPort.Close()
Catch ex As Exception
MessageBox.Show("Closing error: " & ex.ToString)
End Try
Try
tempPort.Open()
MessageBox.Show("COM1 Opened")
Catch ex As Exception
MessageBox.Show("Open error: " & ex.ToString)
End Try
End Sub
End Class
即使重新启动,我在关闭尝试时也没有错误,但是当我尝试打开它时传统访问被拒绝。当然,它确实出现在ListBox1中。
System.UnauthorizedAccessException:访问端口' COM1'是 否认。在System.IO.Ports.InternalResources.WinIOError(Int32 System.IO.Ports.SerialStream..ctor(String。中的errorCode,String str) portName,Int32 baudRate,奇偶校验,Int32 dataBits,StopBits stopBits,Int32 readTimeout,Int32 writeTimeout,握手握手, Boolean dtrEnable,Boolean rtsEnable,Boolean discardNull,Byte 在System.IO.Ports.SerialPort.Open()
中的parityReplace)
触摸屏总是应该在COM4上,当我查看提供的配置实用程序时,它始终显示出来。进入设备管理器显示我在IRQ或COM1的内存位置上看不到任何冲突。什么阻止这个小测试应用程序在重启后打开这台PC上的端口?!?!?
更新 至少现在,它神奇地"固定"本身不知何故(我打赌是gremlins)。经过几个小时的研究后,我再次进行了检查,看看重启进入安全模式是否会有所帮助,看看我的正常程序是否正常运行! WTH?!?!?我问技术人员他做了什么来解决它,他认为我已经做了一些事来解决它。哎呀!我仍然需要找到一个答案,这样生产PC在下次发生这种情况时就不会停机16小时,而我们会碰壁。
答案 0 :(得分:1)
您可能正在获得该异常,因为您在关闭端口后没有等待。
来自SerialPort.Close文档
任何应用程序的最佳实践是等待一些 在尝试调用Open之前调用Close方法之后的时间 方法,因为端口可能不会立即关闭。
不幸的是,没有办法知道你需要等多久。你可以从100毫秒开始然后继续前进。如果它不会打扰用户,我会花500毫秒来保证安全。
理想情况下,您需要Open
一次该端口,并在程序关闭时Close
。
答案 1 :(得分:0)
不是真正的答案(至少),但接下来发生这种情况时,除了尝试安全模式之外,我将尝试使用Process this thread中详述的Process Explorer查找序列句柄。这看起来很有希望。
更新(2017年4月10日) - 感谢Clone在this thread中的答案(不是接受的答案),最终找到了这个问题。 Windows有时会将具有连接到串行端口的常量数据流的设备识别为串行鼠标(例如,Microsoft Serial Ballpoint),并尝试安装它们,在没有任何使用过程的情况下对端口进行控制。实际上,Process Explorer在使用COM1时看不到任何东西。解决方案是使用“鼠标和其他指针设备”下的“设备管理器”禁用(不卸载)设备。