Tutarlı Linux aygıt numaralandırma


13

Linux kutumuzda her zaman olarak tanımlanan USB -> seri cihazımız vardır /dev/ttyACM0. Bu yüzden bir başvuru yazdım ve düne kadar her şey yolunda gitti. Ama aniden (evet, uzak sunum sırasında ...) cihaz çalışmayı durdurdu. Hızlı araştırmadan sonra bağlantının değiştiğini gördüm /dev/ttyACM1. Biraz zamansızdı, ama şimdi bir sorunum var - cihazımı nasıl net bir şekilde tanımlayabilirim? Örneğin, depolama sürücüsü /dev/sd**değişmiş olmasına rağmen UUID kullanılarak başlatılabilir . Seri cihazlar için bunu yapmanın bir yolu var mı?

Şimdi aptal bir çözüm kullanıyorum:

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

Kullandığımız cihazın bağlantısı .

Yanıtlar:


19

USB cihazları konuştuğumuz ve udev'iniz olduğunu varsaydığımız için bazı udev kurallarını ayarlayabilirsiniz.

Sanırım ve bu sadece vahşi bir tahmin, birisi veya cihazın fişini çekti / çıkardı ve tekrar taktı / cihazı tekrar ekledi, bu da numarayı çarptı.

Şimdi, önce satıcı ve ürün kimliklerine ihtiyacınız var:

$ 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

Sonra, seri numarasına ihtiyacınız var (birkaç tane varsa):

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

Şimdi bir udev kuralı oluşturalım:

UDEV kuralları genellikle içindeki birçok dosyaya dağıtılır /etc/udev/rules.d. Yeni bir dosya oluşturun 99-usb-serial.rulesve aşağıdaki satırı buraya koyun, her biri farklı bir seri numarasına sahip üç cihazım var:

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

Seri numarasını istemiyorsanız, aynı çipli satıcıdan herhangi bir cihaz aynı symlink'i alacaktır, herhangi bir zamanda sadece bir tane takılabilir.

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

Buradan alındı


3
Yakın zamanda bir linux dağıtımınız varsa, büyük olasılıkla zaten aygıtı otomatik olarak oluşturur /dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0. Özel udev kuralları olmadan bu sizin için yeterli olabilir.
Josef, Reinstate Monica'ya

1
Ne yazık ki, birçok isimsiz cihazın hepsi "0123456789abcdef" seri numarasına sahiptir. İlginç olan yer burası.
19'da mosvy

@mosvy seri numaraları değiştirilemez mi?
OganM

@OganM değiştirilebilirler ... eğer cihazları rootlayabiliyorsanız.
19'da mosvy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.