Когда вы открываете порт, класс SerialPort запускает новый поток под капотом, который отвечает (через функцию Windows API WaitCommEvent) за ожидание активности последовательного порта (например, поступление данных) и запуск соответствующих событий для ваших обработчиков.,Вот почему такие события, как DataReceived, действительно происходят во вторичном потоке.
Когда вы закрываете порт, вызов Close () немедленно возвращается, но для вторичного потока требуется некоторое время для замедления.
Если вы попытаетесь открыть порт слишком быстро после вызова Close, а поток еще не отключился, то экземпляр SerialPort не находится в состоянии, в котором он может начать новое соединение.
Обратите внимание на Документация MSDN для SerialPort.Close гласит:
Лучше всего для любого приложения подождать некоторое время после вызова метода Close, прежде чем пытаться вызвать метод Open,поскольку порт может быть закрыт не сразу.
Вы можете отслеживать, когда закрыли порт, и перед тем, как открыть его снова, убедитесь, что истек произвольный тайм-аут.
Нет необходимостиспать перед чтением / записью, хотя следует учесть несколько причуд:
Имейте в виду, что класс SerialPort в .NET BCL по-прежнему полагаетсяна базовый Win32 API, и я не думаю, что он получил большую любовь от Microsoft с момента первоначальной реализации.
Для получения дополнительной информации см .: