Konsistente Linux-Gerätezählung

13

In unserer Linux-Box haben wir USB -> serielles Gerät, das immer als identifiziert wurde /dev/ttyACM0. Also habe ich eine Bewerbung geschrieben und bis gestern hat alles gut geklappt. Aber plötzlich (ja, während der Remote-Präsentation ...) funktionierte das Gerät nicht mehr. Nach kurzer Recherche stellte ich fest, dass sich die Verbindung zu änderte /dev/ttyACM1. Es war ein bisschen zu früh, aber jetzt habe ich ein Problem - wie kann ich mein Gerät eindeutig identifizieren? Wie zum Beispiel könnte das Speicherlaufwerk mit der UUID initialisiert werden, obwohl sich die /dev/sd**geändert hat. Gibt es eine Möglichkeit, dies für serielle Geräte zu tun?

Jetzt benutze ich eine blöde Umgehung:

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);
}

Der Link zu dem Gerät, das wir verwenden.

folibis
quelle

Antworten:

19

Da es sich um USB-Geräte handelt und davon ausgegangen wird, dass Sie über udev verfügen, können Sie einige udev-Regeln einrichten.

Ich denke, und dies ist nur eine wilde Vermutung, jemand oder etwas hat das Gerät ausgesteckt / entfernt und wieder eingesteckt / das Gerät wieder hinzugefügt, was die Zahl erhöht.

Nun benötigen Sie zuerst die Hersteller- und Produkt-IDs:

$ 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

Als nächstes benötigen Sie die Seriennummer (falls Sie mehrere haben):

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

Nun erstellen wir eine udev-Regel:

UDEV-Regeln sind in der Regel auf viele Dateien verteilt /etc/udev/rules.d. Erstellen Sie eine neue Datei mit dem Namen 99-usb-serial.rulesund fügen Sie die folgende Zeile ein. Ich habe drei Geräte mit jeweils einer anderen Seriennummer:

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

Wenn Sie die Seriennummer nicht möchten, erhält jedes Gerät eines Herstellers mit demselben Chip denselben Symlink. Es kann immer nur eines angeschlossen werden.

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

Von hier genommen

thecarpy
quelle
3
Wenn Sie eine aktuelle Linux-Distribution haben, wird das Gerät höchstwahrscheinlich bereits automatisch als erstellt /dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0. Dies könnte für Sie ohne benutzerdefinierte udev-Regeln ausreichen.
Josef sagt Reinstate Monica
1
Leider haben viele No-Name-Geräte alle die Seriennummer "0123456789abcdef". Dort wird es interessant.
Mosvy
@mosvy sind Seriennummern unveränderlich?
OganM
@OganM Sie können geändert werden ... wenn Sie in der Lage sind, die Geräte zu rooten.
Mosvy