2012-06-25 3 views
3

Я пишу программу SerialPort. Иногда, когда я хочу открыть SerialPort, генерируется UnauthorizedAccessException: доступ к COM1 запрещен. Это потому, что в другой программе (которая написана кем-то еще, и у меня ее нет) используется COM1, и эта программа не закрывает COM1 при выходе. Я хочу задать 2 вопроса:
Как закрыть последовательный порт, используемый другой программой

  1. Как закрыть COM1 с моим кодом (особенно C# код), когда он используется другой программой?
  2. Если я не могу закрыть COM1 с кодом C#, как я могу закрыть или освободить COM1 в ОС Windows?

Спасибо.

+0

Возможно, вы можете задействовать порт, используя WMI. http://msdn.microsoft.com/en-us/library/windows/desktop/aa393485(v=vs.85).aspx – Kane

+0

Мое предположение заключается в том, что программа, которая запутывает Com-порт, не выходит полностью из-за того, что окна должны восстановить Com-порт, попробовали ли вы посмотреть, работает ли этот процесс? –

+0

Я также думаю, что некоторые программы не закрывают SerialPort после его использования. Но я не уверен, какой из них. – Jerry

ответ

6

Этот вопрос переполнения стека является первым шагом: How do I get the list of open file handles by process in C#?

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

Это, однако, очень рискованно *, подвержено проблемам и нуждается в повторной инженерии на основе конкретных развертываний (x32 vs x64 vs ARM) плюс то, что «COM1» отображает на этой конкретной машине.

Опасность: если последовательный порт используется, например, для установки новой прошивки на телефоне или аналогичного устройства - закрытие порта может привести к поломке устройства. Если порт используется для передачи данных, то закрытие порта может привести к потере данных.

Удачи. Но, пожалуйста, НЕ обвиняйте меня, если вы уничтожаете свою систему или теряете данные.

+0

Спасибо. I Но я не знаю имя файла или дескриптор файла COM1, можете ли вы рассказать мне об этом? – Jerry

+1

Он будет выглядеть как '\ Device \ Com0' или' \ Device \ Serial0' - См. [Именование файлов Win32] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247 (v = vs.85) .aspx # win32_device_namespaces) - и используйте [SysInternals WinObj] (http://technet.microsoft.com/en-us/sysinternals/bb896657.aspx) для просмотра устройств вашей машины. –

-2

Вы можете закрыть порт связи в C# по телефону

serialPort.Close(); 

Но вы не можете закрыть порт COMM, если он не будет открыт только вам.

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

+2

Вы не ответили на мой вопрос. Я знаю, что serialPort.close() может закрыть SerialPort, который я открыл. Я хочу закрыть COM1, открытый другой программой, написанной кем-то другим. – Jerry

+0

То, что я сказал, вы не можете закрыть COMMPort, к которому обращается другое приложение. Только то, как вы можете это сделать, это определить, какое приложение выполняет доступ и убивает этот процесс. –

+0

Я так не думаю. Я использую компьютер, я могу написать любой код, работающий на нем, я полностью контролирую его. Должен быть способ закрыть COM1, используемый другой программой. Например, найдите и уничтожьте поток, используемый COM1. Я хочу найти простой способ. – Jerry

Смежные вопросы