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

C# 如何确定是什么使用串行端口资源导致访问被拒绝?,c#,.net,vb.net,serial-port,C#,.net,Vb.net,Serial Port,我已经厌倦了经常和这件事做斗争。有问题的个人电脑是工业触摸屏型号,永远不会改变。这是Windows10,而我相信它也发生在Windows7上。而在过去,有时此错误处理模拟com端口(即USB连接器),在这种情况下,它是一个真正的com端口,因此我不能将其插入另一个端口,因为我使用两个232连接器。这台电脑可以正常工作几个月,然后有一天COM端口出了问题,我将不得不重新整理它们,试图找出哪些现在可以工作。这是一个很大的痛苦,当我必须远程(1000英里以外)使用技术时,有时不得不将电缆插入不同的位置

我已经厌倦了经常和这件事做斗争。有问题的个人电脑是工业触摸屏型号,永远不会改变。这是Windows10,而我相信它也发生在Windows7上。而在过去,有时此错误处理模拟com端口(即USB连接器),在这种情况下,它是一个真正的com端口,因此我不能将其插入另一个端口,因为我使用两个232连接器。这台电脑可以正常工作几个月,然后有一天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
即使在重新启动后,我也不会在尝试关闭时出错,但在尝试打开时,传统的访问被拒绝。当然,它会出现在列表框1中

System.UnauthorizedAccessException:无法访问端口“COM1” 否认。位于System.IO.Ports.InternalResources.WinIOError(Int32 System.IO.Ports.SerialStream..ctor(字符串)处的错误代码,字符串str) 端口名、Int32波特率、奇偶校验、Int32数据位、停止位 停止位、Int32读取超时、Int32写入超时、握手、, 布尔dtrEnable,布尔rtsEnable,布尔丢弃NULL,字节 parityReplace)位于System.IO.Ports.SerialPort.Open()处

触摸屏应该总是在COM4上,当我查看提供的配置实用程序时,它总是显示出来。进入设备管理器显示,我在IRQ或COM1的内存位置上看不到任何冲突。是什么阻止这个小测试应用在重新启动后打开这台电脑上的端口

更新:
至少现在,它以某种方式神奇地“修复”了自己(我打赌是小精灵)。经过两个多小时的研究后,我重新打开遥控器,看看重新启动到安全模式是否有帮助,看看我的正常程序正在运行!什么?!?!?我问技术人员他做了什么来修复它,他认为我做了些什么来修复它。啊!!!我仍然需要找到答案,以便下次发生这种情况时,生产PC不会停机16小时。

您可能会遇到这种异常,因为关闭端口后您没有等待

从文件

任何应用程序的最佳实践都是等待一定数量的 在尝试调用Open之前调用Close方法后的时间 方法,因为端口可能不会立即关闭

不幸的是,没有办法知道你需要等待多久。你可以从100毫秒开始,然后一直往上走。若它不会打扰用户,为了安全起见,我会选择500毫秒

理想情况下,您将
打开
端口一次,然后在程序关闭时
关闭

不是真正的答案(至少是这样),但下次发生这种情况时,除了尝试安全模式外,我将尝试使用Process Explorer查找串行句柄,如中所述。这似乎很有希望


更新(2017年4月10日)-由于克隆人在中的答案(不是公认的答案),最终发现了问题。Windows有时会将连接到串行端口的恒定数据流的设备识别为串行鼠标(例如Microsoft串行圆珠笔),并尝试安装这些设备,在不使用任何进程的情况下控制端口。实际上,Process Explorer在使用COM1时看不到任何东西。解决方案是使用鼠标和其他定点设备下的设备管理器禁用(而不是卸载)设备。

请参阅Hans Passant的答案和@HebeleHododo,我以前见过这些答案,但看不出两者在这种情况下有什么关系。正确的建议与此处的主题没有多大关系,请与您的主管讨论。只要保护自己不受技术人员下一步开始修补硬件时所犯的常见错误的影响。在VB.NET中,使用项目>属性>应用程序选项卡>勾选“生成单实例应用程序”复选框。@HansPassant我总是在我的应用程序中勾选该复选框,除非我确实希望运行多个副本,我认为这只运行了一次。除非我告诉他们,否则这些技术人员不会修补电脑硬件。任何问题,他们都会打电话给我,让我找出问题所在。这似乎仍然不相关。我的普通程序只是检查IsOpen属性,然后执行Open。我只是把关闭放在我的小测试程序中,只是为了证明在尝试打开它之前确实关闭了端口(并查看关闭是否会产生错误)。我将从我的测试应用程序中删除关闭,但高度怀疑这是否会改变任何事。事实上,在重新启动后立即尝试打开会给COM1带来相同的结果。COM4也是如此,因为这正是触摸屏硬件所使用的。其他港口没问题,嗯,我不知道。我把答案留作参考,如果其他人想回答你的问题,他们会知道这已经尝试过了。祝你好运呃,魔法修复是最糟糕的:(希望你能找出问题的原因。