我正在使用带有串行对象的串口,有时我会收到此错误。
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
我正在调试的错误,一切都很好。否则,与串行设备的通信是完美的。但是当程序实际发布,部署和运行时,它会给我一些错误消息并且对用户来说都很难看。
如何捕获此错误/我该怎么做才能首先阻止它?
由于
答案 0 :(得分:1)
当与USB转串口转换器一起使用时,我在WinForms应用程序中遇到相同的异常和堆栈跟踪。我可以通过
不断重新创建它我怀疑是在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