如何确定什么是使用串行端口资源,导致访问被拒绝



我经常对此感到厌倦。有问题的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'IS 否认。在system.io.ports.internalresources.winioerror(int32) errorcode,string str)at system.io.ports.serialstream..ctor(字符串) portname,int32 baudrate,奇偶校验,int32数据库,stopbits 停止列,INT32 ReadTimeOut,INT32 WriteTimeOut,握手握手, 布尔可延伸,布尔式rtsenable,布尔杜松子酒,字节 parityreplace)at System.io.ports.serialport.open()

触摸屏总是应该在com4上,当我查看所提供的配置实用程序时,它总是显示出来的。进入设备管理器,没有在COM1上看到IRQ或内存位置上看到的冲突。是什么阻止了此小测试应用程序在重新启动后打开该PC上的端口?!?!?

更新:至少目前,它以某种方式神奇地"修复"了(我的赌注是gremlins)。经过几个小时的研究,我重新返回,看看重新启动进入安全模式是否会有所帮助,并看到我的正常程序正在运行!wth?!?!?我问技术他为修复它做了什么,他认为我已经做了一些解决问题的方法。argh!我仍然需要找到答案,以便下次我们在墙上击败头时发生生产PC 16小时。

您可能会得到该异常,因为关闭端口后您没有等待。

来自SerialPort.Close文档

任何应用的最佳实践是等待一定数量 呼叫关闭方法后的时间,然后试图致电打开 方法,因为端口可能不会立即关闭。

不幸的是,没有办法知道您需要等待多长时间。您可以从100毫秒开始,然后上升。如果它不会打扰用户,我会选择500毫秒的安全。

理想情况下,您的程序关闭时,您将Open端口一次,并且Close

并不是真正的答案(至少至少),但是接下来发生这种情况,除了尝试安全模式外,我将尝试使用该线程中详细介绍的过程Explorer找到一个串行句柄。这似乎很有希望。

更新(17年4月10日) - 由于克隆的答案(不是被接受的),终于找到了问题。Windows有时会标识具有连接到串行端口的恒定数据流的设备(例如Microsoft Serial Ballpoint),并试图安装它们,在不使用任何过程的情况下对端口进行控制。确实,Process Explorer无法使用COM1看到任何内容。解决方案是使用鼠标和其他指向设备下的设备管理器禁用(而不是卸载)设备。

最新更新