Statik bir isim altında USB cihazı nasıl bağlanır?


43

Senaryomun başarısız olmasına neden olan bazen /dev/ttyUSB0başkalarına bağlı olan bir Arduino'm var /dev/ttyUSB1.

Cihazımın nerede olabileceği ile ilgili tüm olanakları sıralamak istemiyorum, ama statik bir yere bağlanmasını tercih ederim, örneğin /dev/arduino.

Bunu nasıl başarabilirim?


4
Sadece VID ve PID'leri ile doğru tasarlamaya symlink / dev / arduino atayacak basit bir udev kuralı yazın.
Eddy_Em


Yanıtlar:


41

Önerildiği gibi, bazı udev kuralları ekleyebilirsiniz. Şunları /etc/udev/rules.d/10-local.rulesiçerecek şekilde düzenledim :

ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="my_uart"

Cihazınızın değişkenlerini çalıştırarak kontrol edebilirsiniz.

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)

Http://www.reactivated.net/writing_udev_rules.html adresinden okuyabileceğiniz daha ayrıntılı bir rehber var.


Bir cazibe gibi çalıştı. Bir soru: Nasıl çıkılır udevam? Ve my_uartaltında sembolik bağlantı oluşturduğunu not etmek önemlidir /dev/my_uart. /dev/arduinoİlk kez ilk yazdım ve arduinoyeterli iken başarısız oldu .
k0pernikus

udevadmbitince kendiliğinden çıkmalı.
Kotte

Sonra bilinmeyen bir nedenden ötürü, raporu oluştururken terminal oturumunu Ahududu Pi'ime dondurdu.
k0pernikus

35

Yukarıdaki kural sözdizimi bazı dağıtımlar üzerinde çalışabilir, ancak benimki üzerinde çalışmadı (Raspbian). Tüm giriş ve çıkışları açıklayan tek bir belge bulamadığım için burada bulunabilmek için kendime yazdım . Bu aşağı kaynıyor budur.
1. ttyUSB’de neler olduğunu öğrenin:

dmesg | grep ttyUSB  

2. Cihazın tüm özelliklerini listeleyin:

udevadm info --name=/dev/ttyUSBx --attribute-walk

(elbette x yerine cihaz numaralarınızla). Benzersiz bir tanımlayıcı seti seçin, örneğin idVendor + idProduct. Aynı idVendor ve idProduct'a sahip birden fazla cihazınız varsa, SerialNumber'a da ihtiyacınız olabilir. Seri Numaraları her aygıt için benzersiz olmalıdır.
3. /etc/udev/rules.d/99-usb-serial.rulesİçinde bu satır gibi birşeyle bir dosya oluşturun :

SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="your_device_name" 

(orada bir seri numarasına ihtiyacınız olmadığını ve tabii ki 2. adımda bulduğum idVendor ve idProduct numaralarını içeren varsayılarak)
4. Yeni kuralı yükleyin:

sudo udevadm trigger

5. Ne olduğunu doğrulayın:

ls -l /dev/your_device_name  

sembolik bağlantıya hangi ttyUSB numarasının girdiğini Öyleyse /dev/ttyUSB1, kime sahip olduğunu ve hangi gruba ait olduğunu doğrula:

ls -l /dev/ttyUSB1   

O zaman sadece eğlenmek için:

udevadm test -a -p  $(udevadm info -q path -n /dev/your_device_name)

Öyleyse idVendorve idProducttamamen aynıysa herhangi bir çözüm var mı? (aynı model USB üzerine UART modüllerine takılı iki sensör)
Steven Lu,

@StevenLu Evet, 2. adıma bakın, udevadm info --name=/dev/ttyUSB1 --attribute-walkher iki cihaz için de yapın ve seri numaralarını arayın, bunlar her cihaz için benzersiz olmalıdır. Sensörlerinizde seri numarası yoksa, bunların ne olduğunu belirtebilir misiniz?
RolfBly

Bu harika, bunu denediğimde geri rapor edeceğim
Steven Lu

UART dongle'larındaki 2 $ USB'mde 0001 seri numarası var. Şaşırdığımı söyleyemem. Çıkış protokollerine göre sensörleri tanımlamalıyım.
Steven Lu

@StevenLu Kötü şans. FTDI USB-UART dönüştürücülerinin benzersiz bir seri numarası vardır, AFAIK. Birkaç ekstra para, ancak daha az zaman kazanın.
RolfBly

9

Çok özdeş USB aygıt sorunu

Dört kameralı bir Rasperry Pi'm var. fswebcamKameraları /dev/video0.. olarak tanımlayan pixu alıyorum video3. Bazen kamera video0, vide02, video4ve video6fakat şimdilik bunu unutabilirsiniz.

Bir kamera numarasını tanımlamak için kalıcı bir kimliğe ihtiyacım var ki, örneğin video0, her zaman aynı kameradır, çünkü fotoğraflara resim yazarım. Ne yazık ki bu güvenilir bir şekilde gerçekleşmiyor - açılışta kameralar şu şekilde sıralanıyor video0... video3ancak her zaman aynı şekilde değil.

Kameraların hepsi aynı ID ve seri numarasına sahip.

Bu sorunun çözümü udev kurallarını içerir, ancak burada birçok balık kancası da vardır.

Komutu verirseniz

udevadm info –attribute-walk –path=/dev/video0

çıktının şapını alıyorsunuz ama göze çarpan bitler

KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.

KERNELS bit bir USB hub portudur. Dört kamerayla bunlardan dördü var - yeniden başlatma sırasında değişmiyorlar, ancak video{x}bir bağlantı noktasıyla ilişkili değişebilir.

Bu yüzden bir video numarasını USB hub portuna bağlamak için bir udev kuralına ihtiyacımız var:

KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0” 

Basit görünüyor - kameraya erişin

fswebcam –d  $realpath /dev/camera0

İşe yaramazsa, bunu bir udev kuralına koyarsanız ve sistem video0'u (önyükleme sırasında) farklı bir bağlantı noktasına atadıysa, udev kuralı yoksayılır. /dev/camera0Temelde sembolik bağlantı diyor no such device. Kare bir.

İstediğimiz şey, bir bağlantıyı bir video{x}numaraya değil, bir USB hub adresine bağlamak . Python programını aldı.

İlk adım koşmaktı

fswebcam –d /dev/video${x}  tst.jpg

için x1 ve 8 arasında varlığı tst.jpgbu görüntü sayısına bir kamera olup olmadığını her çağrıdan sonra tespit ettiği. Bundan aktif video numaralarının bir listesini yapın. Tecrübelerim benim ya 0,1,2,3da 0,2,4,6kullandığım kameralar içindi.

Diğerleri elbette bu listeyi farklı bir işlem kullanarak oluşturabilir.

Sonra listedeki her video numarası için

udevadm info –attribute-walk –path=/dev/videox > dd

ve özü KERNELS= lineden dd. Bu işlemden sonra kameralar için USB port adreslerinin bir listesi çıkar. Bu listeyi, bir sonraki adımda her zaman aynı sırayla işlemesi için sıralayın. Buna "adres listesi" deyin.

Şeyi udevadm … > ddtekrar çalıştırın ve benzeyen bir liste yapın

KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.

Şimdi adres listesinde adım atın - her giriş için video listesinden ilgili girişi bulun. Gibi satır koleksiyonuna benzeyen yeni bir liste oluşturun

KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”

X (sembolik bağlantı numarası), adres listesindeki sıra numarası ile değiştirilir.

Şimdi çalışan bir udev kuralınız var. Önyükleme sırasında o bağlantı noktasına hangi video numarası atanırsa yapılsın bir USB hub adresine bağlı bir bağlantı.

Son listeyi bir dosyaya yazın /etc/udev/rules.d/cam.rules. udevadm triggerEtkinleştirmek için çalıştırın ve iş yapılır. /dev/camera2Video numarasından bağımsız olarak aynı kamera (USB bağlantı noktası) olacaktır.


Unix stackexchange'e hoş geldiniz. Lütfen cevabınızı markdown kullanarak biçimlendirin. Sadece senin için yaptım. Ayrıca cevapların konuya gelmesini istediğimizi de unutmayın. Bu daha çok bir blog yazısı gibi okuyor (ki bu tamamen kötü değil), ancak işe yaramayan yaklaşımları ilk kez okumak o kadar da yardımcı olmuyor. Bu kısmı hurda edebilirsiniz.
k0pernikus

Üzgünüm. Ben burada yeniyim. Bu sorunu aylardır araştırdım. Aynı problemle mücadele eden diğerlerini buldum ve benim için işe yarayan bir cevap bulamadım. Sadece bildiğim gibi, böyle bir şey göndermemi nereye tavsiye edersin? Kendimi
zorladım

1

Ayrıca benzersiz bir cihaz bulabildim /dev/serial/by-id. Henüz bir yeniden başlatma denemedim, ancak bu dizindeki dosyalar sadece uygun cihaz dosyasına ( ttyACM[0-9]) bağlandı.

Raspberry Pi'de arch linux kullanıyorum, ancak sadece find"Arduino" içeren bir dosya adı yaparak tökezledim . Python programlarım bu dosyaları Arduinos'uma / Arduinos'dan veri okumak / yazmak için aygıtlar olarak kullanıyor (şimdiye kadar iki tane tek bir Pi'de).


0

Sadece yukarıdakilerin benim için çalıştığını ve / etc / fstab içine bir girdi yerleştirdikten sonra da benim için cihazı otomatik olarak doldurduğunu söylemek için (ve ayrıca çubuğun çıkarılmasından sonra da umount çağırır)

yani

/ Etc / fstab

# See /etc/udev/rules.d/5-usb-disk.rules
/dev/backup     /vol/backup     ext4    defaults,errors=remount-ro 0       1

cat /etc/udev/rules.d/5-usb-stick.rules

#
# the next line creates a symlink to this disk drive called /dev/backup 
# i.e.
#   root:# ls -la /dev/backup 
#   lrwxrwxrwx 1 root root 3 Jul 22 19:33 /dev/backup -> sg0

# Backup usb stick - create /dev/backup
# ATTRS{model}=="Cruzer Blade    "
ACTION=="add", ATTRS{model}=="Cruzer Blade    ", SYMLINK+="backup"

# Clean up after removal  
ACTION=="remove", ATTRS{model}=="Cruzer Blade    ", RUN+="/bin/umount /vol/backup"

Böylece usb bellek çubuğumu yerleştirdikten sonra alıyorum:

root:# mount | grep sd
/dev/sda1 on /vol/backup type ext4 (rw,relatime,errors=remount-ro,data=ordered)
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.