¿Cómo encontrar qué puerto serie está en uso?

33

La pregunta:

Conecté un dispositivo (es decir, un módem GSM) a través de un puerto serie (también conocido como RS-232), y necesito ver con qué archivo en el /dev/sistema de archivos estaba conectado este dispositivo, para poder comunicarme con él. Desafortunadamente, no hay un archivo recién creado /dev/ni se puede ver nada en la dmesgsalida. Entonces, esta parece ser una pregunta difícil.

Fondo:

Nunca había trabajado con un dispositivo en serie, así que ayer, cuando parecía necesario, intenté buscarlo en Google, pero no pude encontrar nada útil. Pasé algunas horas buscando y quiero compartir una respuesta encontrada, ya que podría ser útil para alguien.

Hola angel
fuente
1
Me gusta usar esos bits para detectar un dispositivo; probablemente lo usaré, aunque tengo muchos dispositivos que solo usan los pines Tx / Rx, probablemente podría piratearlos para mantener la línea CTS alta para eso.
Danny Staple
1
stackoverflow.com/questions/2530096/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

34

Desafortunadamente, los puertos seriales no son PlugNPlay, por lo que el kernel no sabe qué dispositivo se conectó. Después de leer un tutorial de HowTo , tengo la idea funcional.

El /dev/directorio de sistemas operativos tipo UNIX contiene archivos denominados como ttySn (siendo n un número) . La mayoría de ellos no corresponde a los dispositivos existentes. Para encontrar cuáles lo hacen, emita un comando:

$ dmesg | grep ttyS
[    0.872181] 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    0.892626] 00:07: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
[    0.915797] 0000:01:01.0: ttyS4 at I/O 0x9800 (irq = 19) is a ST16650V2
[    0.936942] 0000:01:01.1: ttyS5 at I/O 0x9c00 (irq = 18) is a ST16650V2

Arriba hay un ejemplo de salida de mi PC. Puede ver la inicialización de algunos puertos seriales:

ttyS0`` ttyS1` ttyS4` ttyS5.

Uno de ellos tendrá un voltaje positivo en un dispositivo conectado. Por lo tanto, al comparar el contenido del archivo /proc/tty/driver/serialcon y sin el dispositivo conectado, podemos encontrar fácilmente los ttyS relacionados con nuestro dispositivo. Entonces, ahora haz:

$ sudo cat /proc/tty/driver/serial> /tmp/1

(des) conectar un dispositivo

$ sudo cat /proc/tty/driver/serial> /tmp/2

Luego verifique la diferencia entre los dos archivos. A continuación se muestra una salida de mi PC:

$ diff /tmp/1 /tmp/2
2c2
< 0: uart:16550A port:000003F8 irq:4 tx:6 rx:0
---
> 0: uart:16550A port:000003F8 irq:4 tx:6 rx:0 CTS|DSR

Al comparar los tres números con la salida dmesg podemos determinar cuál es el puerto:

[    0.872181] 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A

Por lo tanto, nuestro dispositivo es /dev/ttyS0, ¡misión cumplida!

Hola angel
fuente
1
¿Qué pasa si no veo ningún dispositivo en la salida dmesg?
user3019105
2
@ user3019105 lo siento, nunca me he enfrentado a ese problema. Por lo que entiendo, dmesgdebería tener un mensaje sobre la asignación de irq a un dispositivo en serie. Y si no fuera así, asumiría algún problema de hardware. Eso es solo una suposición, y podría estar equivocado, pero si depurara tal problema, comenzaría a investigar con la idea en mente de que el puerto serie debería haberse inicializado.
Hola Ángel
1
Como me muevo de una máquina a otra, he definido un alias para mostrarme los puertos seriales en esta máquina. Funciona en los sistemas de la familia Ubuntu con systemd. alias ports = 'udevadm info --export-db | grep -i "^ n: ttyu"'
DDay