2013-03-11 26 views
5

C'è un buon modo per rilevare tutti i dispositivi collegati collegati su porte seriali su linux? Im programmazione in C++ ma anche altri esempi sono benvenuti.C++ linux rileva tutte le porte seriali

Si può semplicemente provare ad aprire ogni porta e quando succede lo si aggiunge all'elenco delle porte ma questa non sembra una soluzione davvero buona.

È possibile accedere ai director di sviluppo e poiché la porta seriale è una porta USB, è possibile verificare quali file ttyUSB .. sono stati creati. Ma questo non funziona per le porte seriali non USB poiché i file per tty0 fino a tty63 sono sempre in questa directory.

Il mio esempio:

std::string port; 
int fd 
std::vector<std::string>> list; 
for(int i = 0; i < 256; ++i) 
{ 
    port.clear(); 
    port.append("/dev/ttyUSB"); 
    port.append(std::to_string(i)); 
    fd = open(port.c_str(), O_RDWR | O_NOCTTY | O_DELAY); 
    if(fd != -1) 
    { 
     list.push_back(port); 
    } 
} 

Grazie!

+0

Le porte seriali sono solitamente denominate 'ttyS0' e così via. – Hasturkun

+1

Questo mi dà la sensazione di una domanda XY, in cui il tuo problema reale è X, e tu pensi che la soluzione sia Y, quindi chiedi di Y. Perché vuoi sapere delle porte seriali sul sistema? –

+0

Su 1 delle porte è collegato un dispositivo zigbee. Dal momento che voglio renderlo user friendly voglio elencare tutte le possibilità in modo che l'utente possa scegliere. Normalmente se si collega il dispositivo zigbee si dovrebbe ottenere esattamente un numero di porta restituito. @Hasturkun Nel mio caso dal momento che il mio dispositivo seriale usa una connessione USB è chiamato ttyUSB0. – Silver

risposta

7

Il modo standard di enumerazione dei dispositivi in ​​Linux è la ricerca del file system /sys. In questo caso, è possibile a quanto segue:

  1. enumerare tutti i file in /sys/class/tty
  2. Per ogni directory /sys/class/tty/foo, verificare se esiste /sys/class/tty/foo/device utilizzando lstat().
    • Se non esiste, si tratta di un tipo di dispositivo virtuale tty (porta console virtuale, ptmx, ecc.) E lo si può scartare.
    • Se esiste, conservare la porta seriale foo.

Si dovrebbe essere lasciato con un elenco di porte seriali attuali.

+0

Ottengo 32 dispositivi tramite questo meccanismo. 2 sono validi. È necessario controllare che non stia puntando a 'serial8250', che in realtà è solo il driver – Petesh

+0

In molti dei miei sistemi, ho delle porte seriali valide reali in cui il collegamento simbolico' dispositivo' punta a 'serial8250' ... Non sono certo perché ne hai così tanti di invalidi. – Celada

+0

il 32 proviene dal valore di configurazione del kernel 'CONFIG_SERIAL_8250_RUNTIME_UARTS', presumo che supporti più del' 32' predefinito (questo è un kernel x64 3.2). – Petesh

Problemi correlati