Заставить COM-порт закрыть

Я работаю над приложением, использующим COM-порт для связи с внешним контроллером. Когда я перезагружаю компьютер с подключенным коммуникационным кабелем, Windows (7) открывает порт без запуска какого-либо приложения, поэтому я больше не могу его получить. Я попытался закрыть его программно, но он просто остается.

Кто-нибудь понял, как я могу заставить его закрыть, любую программу, которую я могу запустить перед своим приложением, или способ ее программного закрытия независимо от того, что?

Ответ 1

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

Windows идентифицирует устройства с постоянным потоком данных, подключенным к последовательному порту как последовательная мышь (в этой системе это была Microsoft Serial Ballpoint), и пытается установить их, взяв контроль над портом без какого-либо процесса, использующего его. Решение состоит в том, чтобы дождаться, пока Windows установит устройство (проверьте Диспетчер устройств в разделе "Мышки и другие указывающие устройства" ), а затем ОТКЛЮЧАЙТЕ его. Если вы удалите устройство, оно будет установлено снова, и проблема вернется.

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

Ответ 2

Нет никакого способа заставить порт закрыть (см. question). Невозможно заставить другой процесс закрыть порт, чтобы вы могли его принять.

Но Windows не открывает порт сам по себе - какое-то другое приложение, работающее в фоновом режиме, возможно, это делает. Загрузите Process Explorer и используйте "Find Handle или DLL" в меню "Поиск", чтобы найти процесс с открытым COM-портом. Если это физический COM-порт на машине, он будет называться Serial0, Serial1,... или SerialN, где COM1 сопоставляется с Serial0. Если это адаптер USB для COM, я не уверен, что будет идентификатором устройства.

Вы также можете попробовать использовать PortMon для просмотра активности на порту. PortMon покажет вам процесс, в котором открыт порт.

Ответ 3

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

Ответ 4

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

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

Возможно, внешний контроллер неправильно обрабатывает изменения состояния линий DTR/DSR?

Как проходит кабель между ПК и контроллером?

Трудно сказать гораздо больше, не зная какой-либо специфики.

Ответ 5

Что-то вроде этого?

if (serialPort.IsOpen) serialPort.Close();

Ответ 6

Я сделал это, чтобы отключить контроллер, выключить его, перезагрузить компьютер, включить его (как только загрузится Windows) и вернуться, чтобы включить его. Это сработало для меня с двумя микроконтроллерами с этой проблемой.