我不知道在哪里捕获此错误:拒绝访问该端口

时间:2011-11-29 18:30:51

标签: winforms c#-3.0 serial-port

我正在使用带有串行对象的串口,有时我会收到此错误。

UnauthorizedAccessException: Access to the port is denied.

堆栈跟踪:

   at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
   at System.IO.Ports.InternalResources.WinIOError()
   at System.IO.Ports.SerialStream.Dispose(Boolean disposing)
   at System.IO.Ports.SerialStream.Finalize()

它不会出现在任何代码行中(至少在我的代码中),所以我不确定如何捕获它。我认为正在发生的事情是串口(通过USB)端口被物理上拔掉/断开一瞬间,并且把所有东西都搞砸了。

我可以点击Continue我正在调试的错误,一切都很好。否则,与串行设备的通信是完美的。但是当程序实际发布,部署和运行时,它会给我一些错误消息并且对用户来说都很难看。

如何捕获此错误/我该怎么做才能首先阻止它?

由于

1 个答案:

答案 0 :(得分:1)

当与USB转串口转换器一起使用时,我在WinForms应用程序中遇到相同的异常和堆栈跟踪。我可以通过

不断重新创建它
  • 创建SerialPort的实例
  • 调用SerialPort.Open,
  • 移除USB转串口转换器,
  • 关闭应用(调用SerialPort.Dispose)

我怀疑是在SerialPort的终结器中抛出异常。 其他人也经历过相同的症状 - 见here

为了解决这个问题,我遵循了Kuno和KyferEz的建议(来自上面的链接)来实现我自己的ExtSerialPort。这继承了SerialPort,重写了Dispose方法,并且(使用反射)处理了SerialPort的internalSerialStream。

Imports System.IO.Ports

Public Class ExtSerialPort
    Inherits SerialPort

    Public Sub New()
        MyBase.new()
    End Sub

    Public Sub New(ByVal portName As String)
        MyBase.New(portName)
    End Sub

    Protected Overrides Sub Dispose(ByVal disposing As Boolean)

        Dim mytype As Type = GetType(SerialPort)
        Dim field As Reflection.FieldInfo = mytype.GetField("internalSerialStream", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)
        Dim stream As Object = field.GetValue(Me)

        If stream IsNot Nothing Then
            Try
                stream.Dispose()
            Catch ex As Exception
            End Try
        End If

        MyBase.Dispose(disposing)
    End Sub

End Class