¿Cuál es la forma correcta de obtener una lista de todos los puertos / dispositivos serie disponibles en un sistema Linux?
En otras palabras, cuando itero sobre todos los dispositivos /dev/
, ¿cómo puedo saber cuáles son los puertos serie de la forma clásica, es decir, los que suelen admitir velocidades en baudios y control de flujo RTS / CTS ?
La solución estaría codificada en C.
Lo pregunto porque estoy usando una biblioteca de terceros que hace esto claramente mal: parece que solo se repite /dev/ttyS*
. El problema es que existen, por ejemplo, puertos seriales a través de USB (proporcionados por adaptadores USB-RS232), y estos se enumeran en / dev / ttyUSB *. Y leyendo el Serial-HOWTO en Linux.org , tengo la idea de que también habrá otros espacios de nombres, a medida que llegue el momento.
Entonces necesito encontrar la forma oficial de detectar dispositivos seriales. El problema es que ninguno parece estar documentado o no puedo encontrarlo.
Imagino que una forma sería abrir todos los archivos de /dev/tty*
y llamar a uno específico ioctl()
que solo está disponible en dispositivos seriales. Sin embargo, ¿sería esa una buena solución?
Actualizar
hrickards sugirió buscar en la fuente de "setserial". Su código hace exactamente lo que tenía en mente:
Primero, abre un dispositivo con:
fd = open (path, O_RDWR | O_NONBLOCK)
Entonces invoca:
ioctl (fd, TIOCGSERIAL, &serinfo)
Si esa llamada no devuelve ningún error, aparentemente es un dispositivo en serie.
Encontré un código similar en Serial Programming / termios , que sugirió agregar también la O_NOCTTY
opción.
Sin embargo, hay un problema con este enfoque:
Cuando probé este código en BSD Unix (es decir, Mac OS X), también funcionó. Sin embargo , los dispositivos en serie que se proporcionan a través de Bluetooth hacen que el sistema (controlador) intente conectarse al dispositivo Bluetooth, lo que demora un tiempo antes de que vuelva con un error de tiempo de espera. Esto se debe a que simplemente abre el dispositivo. Y puedo imaginar que cosas similares también pueden suceder en Linux; idealmente, no debería necesitar abrir el dispositivo para averiguar su tipo. Me pregunto si también hay una manera de invocar ioctl
funciones sin abrir, o abrir un dispositivo de una manera que no provoque conexiones.
¿Qué tengo que hacer?