¿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 ...


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)

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.


..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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.