Заставить 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) и вернуться, чтобы включить его. Это сработало для меня с двумя микроконтроллерами с этой проблемой.