Enumerazione coerente dei dispositivi Linux


13

Nella nostra scatola di Linux abbiamo USB -> dispositivo seriale che è stato sempre identificato come /dev/ttyACM0. Quindi ho scritto una domanda e fino a ieri tutto ha funzionato bene. Ma all'improvviso (sì, durante la presentazione remota ...) il dispositivo ha smesso di funzionare. Dopo una rapida ricerca, ho scoperto che la connessione è cambiata in /dev/ttyACM1. È stato un po 'prematuro, ma ora ho un problema: come identificare in modo univoco il mio dispositivo? Ad esempio, è possibile inizializzare l'unità di archiviazione tramite UUID, sebbene /dev/sd**sia stata modificata. C'è un modo per farlo per i dispositivi seriali?

Ora uso una stupida soluzione alternativa:

for(int i = 0; i < 10; i ++)
{
    m_port = std::string("/dev/ttyACM") + (char)('0' + i);
    m_fd = open(m_port.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
}

Il link al dispositivo che utilizziamo.

Risposte:


19

Dal momento che stiamo parlando di dispositivi USB e supponendo che tu abbia udev, potresti impostare alcune regole udev.

Immagino, e questa è solo un'ipotesi selvaggia, qualcuno o qualcosa ha scollegato / rimosso il dispositivo e ricollegato / aggiunto nuovamente il dispositivo, il che aumenta il numero.

Ora, per prima cosa sono necessari gli ID fornitore e prodotto:

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 011: ID 0403:6001 FTDI FT232 USB-Serial (UART) IC

Successivamente, è necessario il numero di serie (nel caso ne abbiate diversi):

# udevadm info -a -n /dev/ttyUSB1 | grep '{serial}' | head -n1
    ATTRS{serial}=="A6008isP"

Ora, creiamo una regola udev:

Le regole UDEV sono generalmente sparse in molti file in /etc/udev/rules.d. Crea un nuovo file chiamato 99-usb-serial.rulese inserisci la seguente riga, ho tre dispositivi, ognuno con un numero seriale diverso:

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="MySerialDevice"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

ls -l /dev/MySerialDevice
lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/MySerialDevice -> ttyUSB1

Se non si desidera il numero di serie, qualsiasi dispositivo del fornitore con lo stesso chip otterrà lo stesso collegamento simbolico, solo uno può essere collegato in un determinato momento.

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="MySerialDevice"

Tratto da qui


3
Se hai una recente distribuzione di Linux, molto probabilmente crea già automaticamente il dispositivo come /dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0. Questo potrebbe essere sufficiente per te senza regole udev personalizzate.
Josef dice di reintegrare Monica il

1
Sfortunatamente, molti dispositivi senza nome hanno tutti il ​​numero di serie "0123456789abcdef". Ecco dove diventa interessante.
mosvy

@mosvy i numeri di serie sono immutabili?
OganM,

@OganM potrebbero essere cambiati ... se sei in grado di eseguire il root dei dispositivi.
mosvy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.