¿Por qué cambia la enumeración de puertos USB?

10

Estoy usando un módem USB Huawei GMS / UMTS con Gnokii y Gammu. El módem estaba en el puerto inferior de Pi. Con dmesg | grep ttyeso aparecería en /dev/ttyUSB0y /dev/ttyUSB1. (2 dispositivos USB en 1 dispositivo es normal, en este caso).

Configuré Gnokii y Gammu en consecuencia, sin embargo, en ttyUSB0 solo podía enviar mensajes. Tanto el envío como la recepción solo funcionarían en ttyUSB1.

Luego moví el dispositivo a la toma USB superior (porque de lo contrario mi dispositivo WiFi no encajaría al lado). Todo seguía funcionando bien. También después de varios reinicios, frío y cálido.

Luego necesitaba expandir el sistema de archivos (Sí, sé que debería haberlo hecho antes). Después de eso, el módem estaba en ttyUSB0 y ttyUSB * 2 *. Enviar / recibir trabajado en este último. Esto me llevó un tiempo descubrirlo.

Actualización: 2 días después, ttyUSB2 ha desaparecido. El módem de trabajo ahora se manifiesta en ttyUSB0 (era ttyUSB1).

¿Alguna idea de por qué sucedió esto? ¿Algún enlace a documentos relevantes de Debian o Linux, tal vez? Estaría muy agradecido ...

RolfBly
fuente
Intenta usar los nombres /sys/class/tty/como guía.
Lekensteyn
Los únicos ttyUSB en / sys / class / tty son ttyUSB0 y ttyUSB1. Ahora. Quién sabe qué será mañana.
RolfBly
La enumeración de USB cambia por diseño, conecta un nuevo dispositivo y obtiene un nuevo número. o tal vez un dispositivo antiguo mientras el número de puerto anterior todavía está ocupado con transferencias sin terminar. intente no volver a conectar los dispositivos demasiado pronto y asegúrese de que todo el software que utiliza estos dispositivos haya terminado felizmente sus negocios.
lenik

Respuestas:

16

La documentación de Gammu sugiere (pero no entra en detalles) una solución alternativa,

Editar: Atmel tiene una Nota de aplicación que describe muy bien el proceso de enumeración.

La enumeración cambia porque ocurre en una conversación entre el host, el concentrador y el dispositivo, y el tiempo de respuesta de cada uno de estos puede variar, incluso si la configuración es idéntica de un reinicio al siguiente.

Actualización: la solución no se encuentra fácilmente en línea y está dispersa en pedazos por todo el lugar. Así que lo puse todo junto en un documento . Esto es a lo que se reduce.
1. descubre lo que hay en ttyUSB:

dmesg | grep ttyUSB  

2. enumere todos los atributos del dispositivo y seleccione un conjunto de identificadores únicos, por ejemplo, idVendor + idProduct (y, si es necesario, SerialNumber si tiene más de un dispositivo con el mismo idVendor e idProduct).

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

3. Cree un archivo /etc/udev/rules.d/99-usb-serial.rulescon algo como esta línea:

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

(suponiendo que no necesita un número de serie allí y, por supuesto, con los números de idVendor e idProduct que encontró en el paso 2.
4. Cargue la nueva regla:

sudo udevadm trigger

5. Verifique lo que sucedió:

ls -l /dev/your_device_name  

mostrará a qué número ttyUSB fue el enlace simbólico. Si es así /dev/ttyUSB1, verifique quién es el propietario y a qué grupo pertenece:

ls -l /dev/ttyUSB1   

Entonces solo por diversión:

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

Has respondido parcialmente tu propia pregunta, pero hay otra forma de hacerlo, especialmente para dispositivos en serie: las /dev/serial/*rutas. Tengo una interfaz USB → RS232 prolífica en mi Raspberry Pi que casi siempre aparece como /dev/ttyUSB0. Pero también aparece en el sistema como:

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

El uso del by-idenlace debe permanecer igual, a menos que agregue otro convertidor basado en PL2303.

scruss
fuente
..Y cuando alguien realmente agrega un nuevo convertidor basado en PL2303. (2 de ellos) entonces, ¿qué se puede donw?
Obmerk Kronen
Estas atorado. Prefiero mezclar y combinar marcas para evitar esto.
scruss
Esto fue inmensamente útil para un puerto serie que me estaba cambiando en Python, ¡gracias!
GhostToast