USB serial COM-порт исчез: отладка пере-нумерации, привязки драйвера, номеров портов и CDC-мостов

Как отлаживать исчезающие USB serial COM-порты, меняющиеся номера, пере-нумерацию, сбросы CDC ACM-моста, сбои привязки драйвера и приложения, держащие устаревшие хэндлы.

USB serial COM-порт исчез, COM-порт отсутствует, CDC ACM, USB serial-мост, пере-нумерация, привязка драйвера, диагностика USB

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_CODING
  • GET_LINE_CODING
  • SET_CONTROL_LINE_STATE
  • SEND_BREAK

Если прошивка ставит stall или некорректно обрабатывает их, порт может открыться, но данные не пойдут, или привязка драйвера упадёт.

Захватите поведение открытия порта, а не только подключения. Многие сбои случаются, когда приложение открывает COM-порт и драйвер шлёт line coding или DTR/RTS.

Устаревшие хэндлы приложения

Иногда USB пере-нумеруется корректно, но приложение держит старый хэндл или кэшированный список COM-портов. Шина показывает, что новое устройство есть. Приложение всё равно падает, потому что не освободило или не обновило порт.

Это не сбой шины USB. Это поведение приложения или управления устройствами.

Чек-лист отладки

Используйте такой воркфлоу:

  1. Захватите с момента подключения.
  2. Подтвердите device descriptor и configuration descriptor.
  3. Изучите дескрипторы CDC-интерфейсов.
  4. Захватите открытие COM-порта приложением.
  5. Изучите CDC класс-управляющие запросы.
  6. Ищите reset или отключение после line coding.
  7. Сравните идентичность устройства до и после переподключения.
  8. Проверьте, изменился ли COM-номер.
  9. Проверьте, не использует ли приложение устаревшее имя порта.
  10. Сохраните USB-доказательства и заметки по назначению порта ОС вместе.

Итоговый диагноз

Исчезающий USB serial COM-порт может быть сбоем перечисления, сбоем CDC-дескриптора, сбоем привязки драйвера, пере-нумерацией с новой идентичностью, сбоем запроса line coding, reset под нагрузкой или устаревшим состоянием приложения.

Bus Scope помогает показать USB-сторону истории, чтобы симптомы COM-порта можно было привязать к подключению, дескрипторам, CDC-запросам, reset и реальной идентичности устройства.