USB serial COM-порт исчез: отладка пере-нумерации, привязки драйвера, номеров портов и CDC-мостов
Как отлаживать исчезающие USB serial COM-порты, меняющиеся номера, пере-нумерацию, сбросы CDC ACM-моста, сбои привязки драйвера и приложения, держащие устаревшие хэндлы.
USB serial-устройств полно: "Arduino, промышленные контроллеры, модемы, GPS-приёмники, тестовые стенды, отладочные пробники, PLC-инструменты, штрихкод-устройства и кастомные CDC ACM-прошивки. Когда COM-порт исчезает, пользователи ищут «USB serial COM port disappears», «COM port missing Device Manager», «USB serial re-enumerates», «CDC ACM device disconnects», «COM port changes after reconnect», потому что приложение обычно просто говорит, что не может открыть порт." Bus Scope полезен потому что у пропадающего COM-порта могут быть очень разные причины: "USB-перечисление, проблемы дескрипторов, привязка драйвера, reset устройства, устаревший хэндл приложения, сбой запроса line coding или назначение нового COM-номера Windows."
COM-порт — это не USB-устройство
COM-порт — это абстракция ОС, создаваемая после перечисления USB-устройства и привязки serial-драйвера. Если USB-устройство вообще не перечисляется, COM-порт появиться не может. Если USB-устройство перечислилось, но CDC-интерфейс упал, COM-порт всё равно может отсутствовать.
Разделите слои:
- Подключилось ли USB-устройство?
- Дескрипторы прочитались корректно?
- Завершилась ли конфигурация?
- Появились ли CDC-интерфейсы?
- Привязался ли драйвер?
- Назначила ли ОС COM-порт?
- Открыло ли приложение правильный текущий порт?
Пере-нумерация меняет номера портов
Windows может назначить новый COM-номер, если устройство появляется с другим serial-номером, другим USB-путём, другим VID/PID или другой идентичностью интерфейса. Устройство, сбрасывающееся в режим загрузчика, может выдать другой COM-порт или вообще никакого.
Симптомы:
- Устройство было COM8, теперь COM11.
- Приложение помнит старый COM-порт.
- Перетыкание в другой USB-порт меняет назначение.
- Загрузчик использует другой порт.
- После обновления прошивки устройство появляется как неизвестное.
Трасса шины покажет, поменялась ли идентичность устройства.
CDC ACM-управляющие запросы
CDC serial-устройства часто получают класс-запросы:
SET_LINE_CODINGGET_LINE_CODINGSET_CONTROL_LINE_STATESEND_BREAK
Если прошивка ставит stall или некорректно обрабатывает их, порт может открыться, но данные не пойдут, или привязка драйвера упадёт.
Захватите поведение открытия порта, а не только подключения. Многие сбои случаются, когда приложение открывает COM-порт и драйвер шлёт line coding или DTR/RTS.
Устаревшие хэндлы приложения
Иногда USB пере-нумеруется корректно, но приложение держит старый хэндл или кэшированный список COM-портов. Шина показывает, что новое устройство есть. Приложение всё равно падает, потому что не освободило или не обновило порт.
Это не сбой шины USB. Это поведение приложения или управления устройствами.
Чек-лист отладки
Используйте такой воркфлоу:
- Захватите с момента подключения.
- Подтвердите device descriptor и configuration descriptor.
- Изучите дескрипторы CDC-интерфейсов.
- Захватите открытие COM-порта приложением.
- Изучите CDC класс-управляющие запросы.
- Ищите reset или отключение после line coding.
- Сравните идентичность устройства до и после переподключения.
- Проверьте, изменился ли COM-номер.
- Проверьте, не использует ли приложение устаревшее имя порта.
- Сохраните USB-доказательства и заметки по назначению порта ОС вместе.
Итоговый диагноз
Исчезающий USB serial COM-порт может быть сбоем перечисления, сбоем CDC-дескриптора, сбоем привязки драйвера, пере-нумерацией с новой идентичностью, сбоем запроса line coding, reset под нагрузкой или устаревшим состоянием приложения.
Bus Scope помогает показать USB-сторону истории, чтобы симптомы COM-порта можно было привязать к подключению, дескрипторам, CDC-запросам, reset и реальной идентичности устройства.