Почему меняется перечисление USB-портов?

10

Я использую USB-модем Huawei GMS / UMTS с Gnokii и Gammu. Модем был в нижнем порту на Пи. С dmesg | grep ttyэтим будет отображаться /dev/ttyUSB0и /dev/ttyUSB1. (2 USB-устройства на 1 флешке - это нормально, в этом случае).

Я настроил Gnokii и Gammu соответственно, однако на ttyUSB0 я мог только отправлять сообщения. Как отправка, так и получение будут работать только через ttyUSB1.

Затем я переместил флешку в верхнее гнездо USB (потому что в противном случае моя WiFi-флешка не поместилась бы рядом с ней). Все продолжало работать нормально. Также после нескольких перезагрузок холодно и тепло.

Затем мне нужно было расширить файловую систему (да, я знаю, что должен был сделать это раньше). После этого модем был на ttyUSB0 и ttyUSB * 2 *. Отправка / получение работали по последнему. Это заняло у меня некоторое время, чтобы узнать.

Обновление: через 2 дня ttyUSB2 исчез. Рабочий модем теперь проявляется на ttyUSB0 (был ttyUSB1).

Есть идеи, почему это произошло? Возможно, есть какие-нибудь ссылки на соответствующие документы по Debian или Linux? Я был бы очень обязан ..

RolfBly
источник
Попробуйте использовать имена в /sys/class/tty/качестве руководства.
Лекенштейн
Единственными ttyUSB в / sys / class / tty являются ttyUSB0 и ttyUSB1. Сейчас же. Кто знает, что будет завтра.
RolfBly
Перечисление USB меняется в зависимости от дизайна, вы подключаете новое устройство и получаете новый номер. или может быть старое устройство, в то время как предыдущий номер порта все еще занят незаконченными передачами. постарайтесь не подключать устройства слишком рано и убедитесь, что все программное обеспечение, использующее эти устройства, успешно завершило свой бизнес.
lenik

Ответы:

16

Документация Gammu предлагает (но не вдаваться в подробности) обходной путь,

Редактировать: Atmel имеет Замечание по применению, которое хорошо описывает процесс перечисления.

Перечисление изменяется, потому что это происходит в диалоге между хостом, концентратором и устройством, и время отклика от каждого из них может варьироваться, даже если настройка идентична от одной перезагрузки к следующей.

Обновление: решение не легко найти в сети, и разбросаны по частям повсюду. Поэтому я собрал все это в одном документе . Вот к чему это сводится.
1. узнать что есть на ttyUSB:

dmesg | grep ttyUSB  

2. перечислите все атрибуты устройства и выберите набор уникальных идентификаторов, например, idVendor + idProduct (и, при необходимости, SerialNumber, если у вас более одного устройства с одинаковыми idVendor и idProduct).

udevadm info --name=/dev/ttyUSB1 --attribute-walk

3. Создайте файл /etc/udev/rules.d/99-usb-serial.rulesс такой строкой:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="your_device_name" 

(при условии, что вам не нужен серийный номер там, и, конечно, с номерами для idVendor и idProduct, которые вы нашли в шаге 2.
4. Загрузите новое правило:

sudo udevadm trigger

5. Проверьте, что случилось:

ls -l /dev/your_device_name  

покажет, на какой номер ttyUSB пошла символическая ссылка. Если это так /dev/ttyUSB1, то проверьте, кому это принадлежит и к какой группе оно принадлежит:

ls -l /dev/ttyUSB1   

Тогда просто для удовольствия:

udevadm test -a -p  $(udevadm info -q path -n /dev/your_device_name)
RolfBly
источник
8

Вы частично ответили на свой вопрос, но есть другой способ сделать это, особенно для последовательных устройств: /dev/serial/*пути. У меня на Raspberry Pi интерфейс Prolific USB → RS232, который почти всегда отображается как /dev/ttyUSB0. Но это также появляется в системе как:

  • /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.3:1.0-port0
  • /dev/serial/by-id/usb-067b_2303-if00-port0

Использование by-idссылки должно остаться прежним, если я не добавлю еще один конвертер на основе PL2303.

scruss
источник
И когда кто-то действительно добавляет новый конвертер на основе PL2303. (2 из них) тогда что может быть Донв?
Обмерк Кронен
Вы застряли. Я предпочитаю смешивать и сочетать бренды, чтобы избежать этого.
scruss
Это было очень полезно для последовательного порта, который менялся в Python - спасибо!
GhostToast