Perché cambia l'enumerazione delle porte USB?


10

Sto usando un modem USB Huawei GMS / UMTS con Gnokii e Gammu. Il modem era nella porta inferiore di Pi. Con dmesg | grep ttyesso si presenterebbe su /dev/ttyUSB0e /dev/ttyUSB1. (2 dispositivi USB su 1 chiavetta sono normali, in questo caso).

Ho configurato Gnokii e Gammu di conseguenza, tuttavia su ttyUSB0 ho potuto solo inviare messaggi. Sia l'invio che la ricezione funzionerebbero solo su ttyUSB1.

Ho quindi spostato la chiavetta nella presa USB superiore (perché altrimenti la mia chiavetta WiFi non si adatterebbe accanto ad essa). Tutto ha continuato a funzionare bene. Anche dopo diversi riavvii, freddo e caldo.

Avevo quindi bisogno di espandere il file system (Sì, lo so che avrei dovuto farlo prima). Successivamente, il modem era su ttyUSB0 e ttyUSB * 2 *. Invia / ricevi lavorato su quest'ultimo. Mi ci è voluto del tempo per scoprirlo.

Aggiornamento: 2 giorni dopo, ttyUSB2 è scomparso. Il modem funzionante ora si manifesta su ttyUSB0 (era ttyUSB1).

Qualche idea sul perché sia ​​successo? Qualche collegamento a documenti debian o linux pertinenti, forse? Sarei molto grato ..


Prova a usare i nomi /sys/class/tty/come guida.
Lekensteyn,

Gli unici ttyUSB in / sys / class / tty sono ttyUSB0 e ttyUSB1. Adesso. Chissà cosa sarà domani.
RolfBly,

L'enumerazione USB cambia in base alla progettazione, si collega un nuovo dispositivo e si ottiene un nuovo numero. o forse un vecchio dispositivo mentre il numero di porta precedente è ancora occupato con trasferimenti incompiuti. cerca di non riconnettere i dispositivi troppo presto e assicurati che tutto il software che utilizza questi dispositivi abbia felicemente concluso la loro attività.
lenik,

Risposte:


16

La documentazione di Gammu suggerisce (ma non entra nei dettagli di) una soluzione alternativa,

Modifica: Atmel ha una nota applicativa che descrive bene il processo di enumerazione.

L'enumerazione cambia perché si verifica in una conversazione tra host, hub e dispositivo e i tempi di risposta di ciascuno di essi possono variare, anche se l'installazione è identica da un riavvio al successivo.

Aggiornamento: la soluzione non è facilmente reperibile on line e sparsa in pezzi ovunque. Quindi ho messo tutto in un unico documento . Questo è ciò a cui si riduce.
1. scopri cosa c'è su ttyUSB:

dmesg | grep ttyUSB  

2. elenca tutti gli attributi del dispositivo e scegli un set di identificatori univoci, ad esempio idVendor + idProduct (e, se necessario, SerialNumber se hai più di un dispositivo con lo stesso idVendor e idProduct).

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

3. Crea un file /etc/udev/rules.d/99-usb-serial.rulescon qualcosa come questa linea al suo interno:

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

(supponendo che non sia necessario un numero seriale lì, e ovviamente con i numeri per idVendor e idProduct che hai trovato nel passaggio 2.
4. Carica la nuova regola:

sudo udevadm trigger

5. Verifica cosa è successo:

ls -l /dev/your_device_name  

mostrerà a quale numero ttyUSB è andato il link simbolico. In tal caso /dev/ttyUSB1, verifica chi è il proprietario e a quale gruppo appartiene:

ls -l /dev/ttyUSB1   

Quindi solo per divertimento:

udevadm test -a -p  $(udevadm info -q path -n /dev/your_device_name)

8

Hai parzialmente risposto alla tua domanda, ma c'è un altro modo di farlo, specialmente per i dispositivi seriali: i /dev/serial/*percorsi. Ho un'interfaccia Prolific USB → RS232 sul mio Raspberry Pi che appare quasi invariabilmente come /dev/ttyUSB0. Ma appare anche sul sistema come:

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

L'uso del by-idcollegamento dovrebbe rimanere lo stesso, a meno che non aggiunga un altro convertitore basato su PL2303.


..E quando qualcuno aggiunge davvero un nuovo convertitore basato su PL2303. (2 di questi) quindi cosa si può indossare?
Obmerk Kronen,

Sei bloccato. Preferisco mescolare e abbinare i marchi per evitarlo.
scruss,

Questo è stato estremamente utile per una porta seriale che mi stava cambiando in Python -grazie!
GhostToast
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.