cass3000 Ответов: 2

Последовательный порт не может быть использован сразу после открытия


У меня проблема с последовательным портом:

Мой код:

Dim readData() As Byte
Dim port As New SerialPort("COM1", 38400, Parity.None, 8)
port.StopBits = StopBits.One
port.Handshake = Handshake.None
port.ReadTimeout = 1000
port.Open()

port.Read(readData, 0, 8)

If readData.Length > 0 Then
   For Each b As Byte In readData
      Me.TextBox1.Text &= b.ToString("X2")
   Next
End If

port.Close()


попытка прочитать порт сразу после его открытия дает мне следующее исключение:

Системы.ИО.Исключение IOException
Операция ввода-вывода была прервана либо из-за выхода потока, либо из-за запроса приложения


Но если я положу нить сна между открытой и прочитанной строками, проблема исчезнет:

port.Open()
System.Threading.Thread.Sleep(20)
port.Read(readData, 0, 8)


Кто-нибудь знает, почему такое поведение?
Правильно ли использовать потоковый сон или есть лучшее решение?

2 Ответов

Рейтинг:
5

cass3000

Спасибо за твой ответ, Дэйв. Я пытался исследовать эту проблему, но мне не очень повезло, тем более что поведение порта не является постоянным, насколько я мог бы попытаться.

Проблема, которую я опубликовал, была значительно уменьшена после перезагрузки моего компьютера, похоже, это было что-то связанное с памятью (я действительно не знаю).

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

<extension()>
Public Sub OpenPort(ByVal port As SerialPort, Optional ByVal millisecondsSleep As Integer = 20)
   port.Open()
   System.Threading.Thread.Sleep(millisecondsSleep)
End Sub


Softvirtue

Я перепробовал все эти методы, но все равно столкнулся с той же проблемой. Некоторое время он считывает вес, но большую часть времени программа просто терпит крах .

Рейтинг:
2

Dave Kreskowiak

Хммм... Я не вижу этой проблемы. Погуглив немного, я понял, что ты не единственный, кто столкнулся с этим. Похоже, что в классе SerialPort может быть небольшая ошибка.

Что странно, так это то, что если вы скомпилируете релиз приложения и запустите его (не под отладчиком!), он может прекрасно работать и без сна. Попробовать это...

Хотя нет ничего плохого в том, чтобы оставить его там.


cass3000

Спасибо за твой ответ, Дэйв.