Qual è il modo corretto per ottenere un elenco di tutte le porte / dispositivi seriali disponibili su un sistema Linux?
In altre parole, quando itero su tutti i dispositivi in /dev/
, come faccio a sapere quali sono le porte seriali nel modo classico, cioè quelle che di solito supportano velocità di trasmissione e controllo di flusso RTS / CTS ?
La soluzione sarebbe codificata in C.
Lo chiedo perché sto usando una libreria di terze parti che lo fa chiaramente in modo sbagliato: sembra solo iterare /dev/ttyS*
. Il problema è che ci sono, ad esempio, porte seriali su USB (fornite da adattatori USB-RS232) e quelle sono elencate in / dev / ttyUSB *. E leggendo il Serial-HOWTO su Linux.org , ho l'idea che ci saranno anche altri spazi per i nomi, col tempo.
Quindi devo trovare il modo ufficiale per rilevare i dispositivi seriali. Il problema è che nessuno sembra essere documentato o non riesco a trovarlo.
Immagino che un modo sarebbe aprire tutti i file da /dev/tty*
e chiamare uno specifico ioctl()
su di essi che è disponibile solo su dispositivi seriali. Sarebbe una buona soluzione, però?
Aggiornare
hrickards ha suggerito di guardare il sorgente di "setserial". Il suo codice fa esattamente quello che avevo in mente:
Innanzitutto, apre un dispositivo con:
fd = open (path, O_RDWR | O_NONBLOCK)
Quindi invoca:
ioctl (fd, TIOCGSERIAL, &serinfo)
Se quella chiamata non restituisce errori, a quanto pare si tratta di un dispositivo seriale.
Ho trovato un codice simile in Serial Programming / termios , che ha suggerito di aggiungere anche l' O_NOCTTY
opzione.
Tuttavia, c'è un problema con questo approccio:
Quando ho testato questo codice su BSD Unix (ovvero, Mac OS X), ha funzionato anche lui. Tuttavia , i dispositivi seriali forniti tramite Bluetooth fanno sì che il sistema (driver) tenti di connettersi al dispositivo Bluetooth, che richiede un po 'di tempo prima che si ritorni con un errore di timeout. Ciò è causato dalla semplice apertura del dispositivo. E posso immaginare che cose simili possano accadere anche su Linux - idealmente, non dovrei aver bisogno di aprire il dispositivo per capire il suo tipo. Mi chiedo se esiste anche un modo per richiamare ioctl
funzioni senza un open, o aprire un dispositivo in modo tale da non causare connessioni?
Cosa dovrei fare?