Принудительно закрыть COM-порт - PullRequest
12 голосов
/ 26 августа 2011

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

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

Ответы [ 6 ]

14 голосов
/ 01 июля 2013

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

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

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

10 голосов
/ 26 августа 2011

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

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

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

2 голосов
/ 07 января 2014

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

1 голос
/ 26 августа 2011

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

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

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

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

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

0 голосов
/ 17 октября 2016

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

0 голосов
/ 26 августа 2011

Как то так?

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