如何确定使用串口资源导致拒绝访问的内容?

时间:2016-12-20 14:34:43

标签: c# .net vb.net serial-port

我已经厌倦了每隔一段时间就打架一次。有问题的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小时,而我们会碰壁。

2 个答案:

答案 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时看不到任何东西。解决方案是使用“鼠标和其他指针设备”下的“设备管理器”禁用(不卸载)设备。