Главная » Статьи о COM-портах » Удаление несуществующих COM-портов

Удаление несуществующих COM-портов

Операционные системы семейства Microsoft Windows поддерживают до 255 последовательных портов. Каждый из этих COM-портов может быть обнаружен с помощью механизма Plug-n-Play с тем, чтобы в дальнейшем обращение к нему выполнялось по мнемоническому имени с COM1 до COMx. Программное обеспечение знает, что UART, обеспечивающий работу последовательного порта по RS232-протоколу, может быть подключен к одной из шинных аппаратных реализаций: начиная с безнадежно устаревших ISA/PCI до самых современных LPC/PCI Express. Не редкость встретить COM-порт на USB-шине, не говоря уже о том, что его функциональность обязательно встроена в Bluetooth-адаптеры и ряд аналогичных коммуникационных устройств.

Операционная система остается в неведении относительно последовательных портов в том случае, когда COM-устройство отключено или исчезло из системы (выполнен unplug). На это случай закрепленное за ним мнемоническое имя в Windows сохраняется, а любому новому COM-порту присваивается первое незанятое имя. Этот процесс документируется в реестре с помощью переменной ComDB, которая хранится в разделе COM Name Arbiter.

Битовое поле ComDB устанавливает флаги (т.е. записывает единицы с соответствующие биты) в тех случаях, когда система задействует тот или иной COM-порт. Так, если у нас есть плата с двумя COM-портами, реализованными силами встроенного SIO-контроллера, переменная ComDB будет равна 03 00… Это означает, что мнемоническое имя COM1 (бит 0) и COM2 (бит 1) заняты. Появление в системе, например, еще одного двухпортового устройства вызовет к жизни COM3 и COM4:

Появление COM3 и COM4 в диспетчере устройств
Рис 1. Дополнительные порты COM3 и COM4 в диспетчере устройств

ComDB станет равна 0f 00… И процесс может продолжаться до исчерпания ресурсов системы:

Переменная ComDB в COM_Name_Arbiter равна 0Fh в случае COM3/COM4
Рис 2. Значение переменной ComDB в COM_Name_Arbiter для COM3/COM4

Как удалить несуществующие COM-порты?

Казалось бы, для того чтобы избавиться от всех последовательных портов, можно отредактировать реестр так, что переменная ComDB будет равна 03 или нулю (в качестве эксперимента по абсолютному удалению COM-портов). Действительно, в операционной системе Windows XP этого было достаточно для приведения ситуации с последовательными портами в исходное состояние. При этом дополнительные COM-порты автоматически обнаруживаются системой. Им присваиваются «правильные» мнемонические имена.

Начиная с Windows Vista ситуация с управлением последовательными портами несколько изменилась. По-прежнему поддерживается битовое поле ComDB, отображающее использование мнемонических имен, но его обнуление уже не дает желаемого эффекта.

Как подчистить COM-порты в Windows 7?

Для того чтобы получить доступ к скрытым последовательным портам в «семерке» нужно выполнить ряд несложных процедур. Перво-наперво требуется в списке переменных среды установить значение системного параметра DevMgr_Show_NonPresent_Devices=1. Если его там нет, следует просто добавить указанное имя.

Добавление новой переменной среды Windows позволит управлять COM-портами
Рис 3. Добавление новой переменной среды Windows позволит управлять COM-портами

Это позволит в «Диспетчере устройств» показать скрытые устройства, а значит — и удалить неиспользуемые:

Доступ к несуществующим COM-портам
Рис 4. Доступ к несуществующим COM-портам

Их легко отличить от существующих в данный момент COM-портов: они отображаются бледным цветом:

Управление неиспользуемыми COM-портами
Рис 5. Управление неиспользуемыми COM-портами

Так можно распрощаться со всеми девайсами, которые когда-то были обнаружены Windows, но сейчас не подключены к системе. Не стоит забывать, что управление свободными мнемоническими именами по-прежнему делегировано переменной ComDB, в чем можно убедиться, заглянув в системный реестр.

Реклама на V-Comp:


21.11.2017