Почему Thread.Sleep () перед SerialPort.Open и Close? - PullRequest
6 голосов
/ 22 июня 2011

Я замечаю примеры кодов, которые я читаю при закрытии и открытии SerialPort, где люди будут добавлять Thread.Sleep (1000) перед SerialPort.Open () и Close (). Как следующее:

Thread.Sleep(1000);
serialPort1.Open();
/* some code */
Thread.Sleep(1000);
serialPort1.Close();

Я нигде не могу найти объяснения. Почему люди блокируют последовательный порт, используя Thread.Sleep, прежде чем он станет открытым или закрытым? Это для какой-то временной цели? Должен ли я ставить Thread.Sleep всякий раз, когда я читаю или пишу на последовательный порт?

Ответы [ 3 ]

10 голосов
/ 14 января 2013

Когда вы открываете порт, класс SerialPort запускает новый поток под капотом, который отвечает (через функцию Windows API WaitCommEvent) за ожидание активности последовательного порта (например, поступление данных) и запуск соответствующих событий для ваших обработчиков.,Вот почему такие события, как DataReceived, действительно происходят во вторичном потоке.

Когда вы закрываете порт, вызов Close () немедленно возвращается, но для вторичного потока требуется некоторое время для замедления.

Если вы попытаетесь открыть порт слишком быстро после вызова Close, а поток еще не отключился, то экземпляр SerialPort не находится в состоянии, в котором он может начать новое соединение.

Обратите внимание на Документация MSDN для SerialPort.Close гласит:

Лучше всего для любого приложения подождать некоторое время после вызова метода Close, прежде чем пытаться вызвать метод Open,поскольку порт может быть закрыт не сразу.

Вы можете отслеживать, когда закрыли порт, и перед тем, как открыть его снова, убедитесь, что истек произвольный тайм-аут.

Нет необходимостиспать перед чтением / записью, хотя следует учесть несколько причуд:

Имейте в виду, что класс SerialPort в .NET BCL по-прежнему полагаетсяна базовый Win32 API, и я не думаю, что он получил большую любовь от Microsoft с момента первоначальной реализации.

Для получения дополнительной информации см .:

3 голосов
/ 22 июня 2011

На один объект SerialPort может существовать только одно открытое соединение. Для любого приложения рекомендуется подождать некоторое время после вызова метода Close, прежде чем пытаться вызвать метод Open, поскольку порт может не закрываться мгновенно.

Посмотрите на эту ссылку .

1 голос
/ 22 июня 2011

Я сделал несколько программ Serial I / O на C #, и я не думаю, что я никогда не добавлял подобные сны Я не испытывал никаких побочных эффектов (с учетом того, что мои приложения никогда не пытались открыть и закрыть последовательный порт в быстрой последовательности)

Вы определенно не должны спать перед чтением или письмом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...