Saltar al contenido

Cómo obtener la relación Bus y Device para un /dev/ttyUSB

Tenemos la contestación a este disgusto, al menos eso esperamos. Si sigues con alguna pregunta dínoslo, que sin dudas

Solución:

Como no tengo su hardware, no puedo darle una respuesta exacta.

Te sugiero que vayas al dispositivo en cuestión, por ejemplo:

ls -l /dev/ttyUSB0

y obtener los números de nodo mayor y menor. Digamos que son 116, 7

Luego ve a:

ls -l /sys/dev/char/116:7

(chardado que un tty es un dispositivo de caracteres, si estuviera rastreando un dispositivo de disco, especificaría block en vez de char)

En el resultado del comando, verá algo parecido a:

lrwxrwxrwx 1 root root 0 Sep 6 00:17 116:7 -> ../../devices//sys/devices/pci0000:00/0000:00:13.5/pci0000:00/0000:00:13.5/usb1/1-3/1-3:1.1/sound/card1/pcmC1D0c

El directorio /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/ y sus subdirectorios tienen mucha información sobre el dispositivo. Como ejemplo, /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnum y /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum. En mi sistema, estos coinciden con el número de bus y dispositivo mencionado en las entradas de hotplug del dispositivo en /var/log/syslog.

Algo más que funciona en mi sistema para /dev/video0:

find /sys/dev -lname '*video0' -exec cat /device/busnum /device/devnum ; 2>/dev/null

Realmente no hay un bueno manera de mapear dispositivos de caracteres como /dev/ttyUSB0 al dispositivo USB correspondiente y a los números de bus. ¡PERO, es posible!

Algo como esto podría funcionar:


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

A partir de ahí, obtendrá un montón de información sobre el dispositivo y sus dispositivos principales. Ahora, solo se trata de analizar esos datos para obtener lo que desea. He usado esto en el pasado:

echo /dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/s*ATTRS((devnum)=="([^"]+)"/4/p' | head -n 2 | awk '$1 = sprintf("%03d", $1); print'` | tr " " "/"

Ahora, si eso no es un bocado, ¡no sé qué es! Vamos a desglosarlo:

udevadm info --name=/dev/ttyUSB0 --attribute-walk – devuelve información sobre el dispositivo y sus dispositivos principales

sed -n 's/s*ATTRS(busnum))=="([^"]+)"/4/p' – analiza estos datos y devuelve cualquier línea que contenga “devnum” o “busnum” attribute. Asumiremos que “busnum” aparece primero… y en ese caso… podemos tomar las dos primeras líneas de salida.

head -n 2 – Coge las primeras 2 líneas de salida. Podríamos ser más sofisticados aquí, pero solo estamos asumiendo que el “busnum” y el “devnum” del padre más cercano se enumerarán primero.

awk '$1 = sprintf("%03d", $1); print' – Toma esos dígitos y los rellena con ceros.

echo /dev/bus/usb – todo este jazz está envuelto en un echo declaración para reemplazar las nuevas líneas con espacios. Puedes agregar el -n a echo si desea cortar la nueva línea final.

tr " " "/" – reemplazar los espacios en la salida con barras diagonales

Esto generará algo como:

/dev/bus/usb/001/011

… que, por supuesto, es el dispositivo. Si lo desea, puede generar fácilmente algo como busnum:001 devnum:011 con algunos ajustes:

echo `udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/s*ATTRS(busnum))=="([^"]+)"/1 4/p' | head -n 2 | awk '$1 = sprintf("%s:%03d", $1, $2); print $1;'`

Eres capaz de patrocinar nuestra misión exponiendo un comentario y dejando una puntuación te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *