Dlaczego zmienia się wyliczanie portów USB?

10

Używam modemu USB Huawei GMS / UMTS z Gnokii i Gammu. Modem był w dolnym porcie na Pi. Dzięki dmesg | grep ttytemu pojawi się na /dev/ttyUSB0i /dev/ttyUSB1. (W tym przypadku 2 urządzenia USB na 1 patyku są normalne).

Skonfigurowałem odpowiednio Gnokii i Gammu, jednak na ttyUSB0 mogłem tylko wysyłać wiadomości. Zarówno wysyłanie, jak i odbieranie działałoby tylko na ttyUSB1.

Następnie przeniosłem patyk do górnego gniazda USB (bo inaczej mój pendrive nie pasowałby do niego). Wszystko działało dobrze. Również po kilku restartach, zimno i ciepło.

Następnie musiałem rozwinąć system plików (Tak, wiem, że powinienem to zrobić wcześniej). Następnie modem był na ttyUSB0 i ttyUSB * 2 *. Wysyłanie / odbieranie działało na tym drugim. Zajęło mi to trochę czasu, aby się dowiedzieć.

Aktualizacja: 2 dni później ttyUSB2 zniknął. Działający modem przejawia się teraz na ttyUSB0 (wcześniej ttyUSB1).

Masz pojęcie, dlaczego tak się stało? Jakieś linki do odpowiednich dokumentów Debiana lub Linuksa? Byłbym bardzo zobowiązany ..

RolfBly
źródło
Spróbuj użyć nazw w /sys/class/tty/jako przewodnika.
Lekensteyn,
Jedynymi ttyUSB w / sys / class / tty są ttyUSB0 i ttyUSB1. Teraz. Kto wie, co będzie jutro.
RolfBly,
Numeracja USB zmienia się zgodnie z projektem, podłączasz nowe urządzenie i otrzymujesz nowy numer. a może stare urządzenie, podczas gdy poprzedni numer portu jest nadal zajęty niedokończonymi transferami. staraj się nie przywracać urządzeń zbyt wcześnie i upewnij się, że całe oprogramowanie korzystające z tych urządzeń zakończyło swoją działalność.
lenik,

Odpowiedzi:

16

Dokumentacja Gammu sugeruje (ale nie zagłębia się w żaden szczegół) obejście,

Edycja: Atmel ma notatkę aplikacji, która ładnie opisuje proces wyliczania.

Wyliczanie zmienia się, ponieważ dzieje się to w rozmowie między hostem, koncentratorem i urządzeniem, a czas reakcji każdego z nich może się różnić, nawet jeśli konfiguracja jest identyczna od jednego restartu do drugiego.

Aktualizacja: Rozwiązanie nie jest łatwe do znalezienia w Internecie i rozrzucone na kawałki w całym miejscu. Więc złożyłem to wszystko w jednym dokumencie . Do tego się sprowadza.
1. dowiedz się, co jest na ttyUSB:

dmesg | grep ttyUSB  

2. wypisz wszystkie atrybuty urządzenia i wybierz unikalny zestaw identyfikatorów, np. IdVendor + idProduct (i jeśli to konieczne SerialNumber, jeśli masz więcej niż jedno urządzenie z tym samym idVendor i idProduct).

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

3. Utwórz plik /etc/udev/rules.d/99-usb-serial.ruleszawierający coś takiego jak ten wiersz:

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

(zakładając, że nie potrzebujesz tam numeru seryjnego i oczywiście z numerami idVendor i idProduct, które znalazłeś w kroku 2.
4. Załaduj nową regułę:

sudo udevadm trigger

5. Sprawdź, co się stało:

ls -l /dev/your_device_name  

pokaże, na jaki numer ttyUSB poszedł dowiązanie symboliczne. Jeśli tak /dev/ttyUSB1, sprawdź, kto jest jego właścicielem i do której grupy należy:

ls -l /dev/ttyUSB1   

Więc dla zabawy:

udevadm test -a -p  $(udevadm info -q path -n /dev/your_device_name)
RolfBly
źródło
8

Częściowo odpowiedziałeś na swoje pytanie, ale jest na to inny sposób, szczególnie w przypadku urządzeń szeregowych: /dev/serial/*ścieżki. Mam interfejs Prolific USB → RS232 na moim Raspberry Pi, który prawie zawsze pojawia się jako /dev/ttyUSB0. Ale pojawia się również w systemie jako:

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

Korzystanie z by-idlinku powinno pozostać takie samo, chyba że dodam kolejny konwerter oparty na PL2303.

szum
źródło
..I kiedy ktoś naprawdę dodaje nowy konwerter oparty na PL2303. (2 z nich) to co może być donw?
Obmerk Kronen
Utknąłeś. Wolę mieszać i dopasowywać marki, aby tego uniknąć.
scruss
Było to niezwykle pomocne dla portu szeregowego, który zmieniał się na mnie w Pythonie - dzięki!
GhostToast,