1

Я не уверен, что этот вопрос находится на правильном сайте stackexchange, потому что это смесь программирования и аппаратного обеспечения. Админ, не стесняйтесь переносить его на другой сайт stackexchange.

Вот проблема:

Я запрограммировал небольшое приложение (C++ MFC), которое считывает вывод GPS (Garmin, выводящий NMEA) через последовательный порт (COM 1). Пока все отлично работает, но для полевых испытаний нам нужно было использовать его на ноутбуке без COM-порта.

Таким образом, мы купили кабель SABRENT USB-to-serial для этапа тестирования. Я установил драйвер кабеля и все было в порядке. Но каждый раз, когда мы отключаем / снова подключаем кабель ИЛИ каждый раз, когда компьютер перезагружается, GPS определяется как последовательная мышь. Когда GPS обнаруживается как последовательная мышь, мышь начинает перемещаться повсюду, щелкая и дважды щелкая случайным образом, вызывая серьезную проблему.

Это никогда не происходило с использованием физического COM-порта на моем компьютере.

Вот решение, которое я прочитал и попробовал, но оно не работает:

  1. Подключайте USB-кабель только после завершения загрузки компьютера. Кажется, он работает только в том случае, если пользователь не отключает и не подключает USB-кабель. Так как подключение и отключение GPS во время устранения неполадок является очень распространенным явлением, это решение не может быть использовано. Кроме того, подключение после перезагрузки не может быть стабильным решением, так как этот GPS будет постоянно установлен на компьютер в грузовике, который используется техником, который мало знает о компьютерах, я не хочу, чтобы они связывались с ожиданием перезагрузки компьютера перед подключением GPS.
  2. Добавление ключа SkipEnumerations в реестр для COM-порта, вызывающего ошибку: Это невозможно сделать, потому что каждый раз, когда USB подключен, создается виртуальный COM-порт, а число является довольно случайным (COM6, COM7 и т.д.). Также виртуальный COM-порт отсутствует в реестре.
  3. Отключить обнаруженную последовательную мышь: это невозможно сделать, потому что, когда мышь обнаружена, я больше не могу контролировать свою обычную мышь, и это полный беспорядок. Как только я отсоединяю USB-кабель, мышь исчезает из диспетчера устройств, поэтому уже слишком поздно.

2 ответа2

6

Так как люди найдут это с помощью Google WWWW, вот несколько обобщенный ответ.

Последовательные порты могут быть подключены к разным вещам. Они не просто разговаривают с модемами. Они также могут разговаривать с мышами, например, или с графическими планшетами. Существует целая спецификация, спецификация внешнего COM-устройства Plug and Play, касающаяся того, как перечисление Plug & Play работает через последовательные порты. К сожалению, ваш GPS-приемник не является надлежащим последовательным устройством Plug & Play, и непрерывный поток данных, который он отправляет на хост, сбивает с толку протокол перечисления Plug & Play последовательного порта.

Возможно, сам кабель USB-адаптера выполняет автоматическое определение Plug & Play.

Устройства USB имеют типы, так называемые классы устройств, о которых они сообщают хосту. Адаптированным устройством может быть, с точки зрения мира USB, тип устройства с последовательным портом (класс устройства класса устройств связи) или тип устройства мыши (класс устройства интерфейса пользователя ). Известно, что несколько адаптерных кабелей USB-RS-232 определяют, какой класс USB-устройств они сообщают о себе хосту, на основании того, что они обнаруживают при подключении к интерфейсу RS-232. Они будут пытаться связаться с устройством, автоматически определять, что это за последовательное устройство, и соответственно изменять свой собственный класс устройств. Если GPS-приемник для них выглядит как мышь, они сообщат о себе как устройство USB HID.

В этом случае ваш правильный первый шаг - заменить кабель адаптера кабелем, который не выполняет это автоматическое определение. Чтобы узнать, происходит ли это, просмотрите устройство USB в диспетчере устройств Windows и посмотрите, является ли оно USB HID или устройством USB CDC.

Из руководства производителя видно, что адаптеры Sabrent USB-RS-232 не такие интеллектуальные; хотя неясно, в чем разница между ароматами "К" и "М", и это может быть фактором. В этом случае, однако, вы не вне леса, потому что есть второй раунд автоопределения:

Windows может делать автоопределение Plug & Play.

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

Здесь есть две иронии. Во-первых: это означает, что "умный" адаптер USB -RS-232, который уже сам выполнил квитирование и определил, что это устройство CDC, а не HID, может пройти второй раунд квитирования, когда сама Windows пытается чтобы определить, к чему этот последовательный порт подключен. Во-вторых: даже на машинах, в которых логика материнской платы RS-232 отсутствует в микросхеме Super I/O, подключенной к разъему I/O, драйвер устройства последовательного порта Windows старательно пытается проверить, что физически подключено к порту.

Есть несколько способов решить эту проблему:

  • Отключите драйвер sermouse полностью. Это простой вопрос изменения его начального класса, увядания путем настройки реестра напрямую или с помощью диспетчера служб Windows, с автоматического на ручной. Драйвер sermouse вызывается, когда драйвер шины serenum обнаруживает мышь, подключенную к последовательному порту. Если драйвер sermouse установлен на Manual, он не запустится автоматически и не создаст объект устройства "mouse" для новой "мыши", которая была (ошибочно) автоматически обнаружена. serenum , сделанное сереной, все еще будет происходить; и диспетчер устройств может сообщать о невозможности управления устройством, поскольку драйвер не запускается. Кроме того, порт, конечно, не будет полностью распознан и указан в качестве устройства связи. В конце концов, система считает, что это мышь.
  • Делайте то, что Microsoft говорит делать со времен Windows NT 5. В статье 283063 базы знаний Microsoft описывается именно эта ситуация и указывается, что Microsoft десять лет назад, полностью в 2001 году, обновила свой драйвер serenum для включения функции обхода. Нужно найти в реестре информацию о параметрах устройства для этого конкретного экземпляра последовательного устройства и добавить к нему значение SkipEnumerations , чтобы не serenum попытки серенаума перечислить его. Полная информация, в том числе о том, где искать в реестре последовательные устройства в системах с разными HAL, содержится в статье базы знаний.

    Да, эти вещи есть в реестре и не являются "виртуальными". если вы ищете «виртуальные COM-порты», вы ищете неправильные вещи. Прочитайте статью и следуйте инструкциям.

  • Используйте инструмент, предоставляемый Microsoft, чтобы исправить это со времен Windows NT 5.2. Этот инструмент слегка обманчиво называют COMDisable , а инструкции по его получению и использованию содержатся в статье базы знаний Microsoft 819036. По сути, он выполняет те же изменения в реестре, что и выше, чтобы изменить поведение драйвера устройства serenum без необходимости трудоемкого определения местоположения параметров устройства в реестре.
1

Нашел этот сайт, который может быть полезен. Прочитайте 2-й пост от Antipodean:

Класс CDC, запрограммированный Microchip, будет обрабатывать 255 байт, но вы должны быть осторожны. Если вы начнете посылать символы до того, как устройство завершит перечисление хоста (особенно если хост Windows) перечислит порт как мышь. Если это произойдет, курсор будет непрерывно прыгать по всему экрану, так как хост обрабатывает данные GPS как данные мыши. Чтобы прекратить это, вам нужно подождать, пока символы, которые посылает хост, попытаться распознать мышь, и подождать несколько секунд, прежде чем разрешить передачу любых данных.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .