Я не знаю, где ловить эту ошибку: доступ к порту запрещен - PullRequest
2 голосов
/ 29 ноября 2011

Я использую последовательный порт с Serial Object, и иногда я получаю эту ошибку.

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) порт физически отключается / отключается на доли секунды и бросает все в грохот.и все хорошо.В противном случае связь с последовательным устройством безупречна.Но когда программа действительно опубликована, развернута и запущена, она выдает мне несколько сообщений об ошибках и все это ужасно для пользователя.

Как я могу перехватить эту ошибку / что я могу сделать, чтобы ее предотвратить?

Спасибо

1 Ответ

1 голос
/ 08 августа 2012

Я сталкиваюсь с тем же исключением и трассировкой стека в моем приложении WinForms, когда используется конвертер USB-to-serial. Я могу последовательно воссоздать его по

  • создание экземпляра SerialPort
  • вызов SerialPort.Open,
  • снятие конвертера USB-to-serial,
  • закрытие приложения (которое вызывает SerialPort.Dispose)

Я подозреваю, что исключение выдается в финализаторе SerialPort. Другие испытывали те же симптомы - см. здесь .

Чтобы обойти эту проблему, я последовал рекомендации Kuno и KyferEz (по ссылке выше) для реализации моего собственного ExtSerialPort. Он наследует SerialPort, переопределяет метод Dispose и (используя отражение) удаляет внутреннюю SerialPortSerialStream.

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
...