การแจกแจงอุปกรณ์ Linux ที่สอดคล้องกัน


13

ในกล่องลินุกซ์เรามี USB -> /dev/ttyACM0อุปกรณ์แบบอนุกรมซึ่งถูกระบุว่าเคยเป็น ดังนั้นฉันจึงเขียนใบสมัครและจนถึงเมื่อวานทุกอย่างทำงานได้ดี แต่ทันใดนั้น (ใช่ในระหว่างการนำเสนอระยะไกล ... ) อุปกรณ์หยุดทำงาน /dev/ttyACM1หลังจากการวิจัยอย่างรวดเร็วผมพบว่าการเชื่อมต่อเปลี่ยนไป มันไม่เหมาะเล็กน้อย แต่ตอนนี้ฉันมีปัญหา - จะระบุอุปกรณ์ของฉันได้อย่างไร? ตัวอย่างเช่นไดรฟ์จัดเก็บข้อมูลสามารถเริ่มต้นได้โดยใช้ UUID แม้ว่าจะ/dev/sd**มีการเปลี่ยนแปลง มีวิธีการทำเช่นนั้นสำหรับอุปกรณ์แบบอนุกรมหรือไม่?

ตอนนี้ฉันใช้วิธีแก้ปัญหาโง่:

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

การเชื่อมโยงกับการใช้อุปกรณ์ที่เรา

คำตอบ:


19

เนื่องจากเรากำลังพูดถึงอุปกรณ์ USB และสมมติว่าคุณมี udev คุณสามารถตั้งค่ากฎ udev ได้

ฉันเดาและนี่เป็นเพียงการคาดเดาใครบางคนหรือบางสิ่งบางอย่างถอดปลั๊ก / ลบอุปกรณ์และเสียบกลับเข้าไปใน / เพิ่มอุปกรณ์อีกครั้งซึ่งกระแทกขึ้นจำนวน

ตอนนี้ก่อนอื่นคุณต้องมีผู้จำหน่ายและรหัสผลิตภัณฑ์:

$ 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

ถัดไปคุณต้องมีหมายเลขซีเรียล (ในกรณีที่คุณมีหลายหมายเลข):

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

ตอนนี้ให้สร้างกฎ udev:

กฎ udev /etc/udev/rules.dมักจะกระจายลงในไฟล์จำนวนมากใน สร้างไฟล์ใหม่ชื่อ99-usb-serial.rulesและวางบรรทัดต่อไปนี้ในนั้นฉันมีสามอุปกรณ์แต่ละอันมีหมายเลขซีเรียลต่างกัน:

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

หากคุณไม่ต้องการหมายเลขซีเรียลอุปกรณ์ใด ๆ จากผู้ขายที่มีชิปเดียวกันจะได้รับ symlink เดียวกันโดยสามารถเสียบเพียงครั้งเดียวในเวลาใดก็ตาม

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

ถ่ายจากที่นี่


3
/dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0หากคุณมีการกระจายลินุกซ์ที่ผ่านมาส่วนใหญ่แล้วจะสร้างอุปกรณ์ที่เป็น นี่อาจเพียงพอสำหรับคุณโดยไม่มีกฎ udev ที่กำหนดเอง
Josef พูดว่า Reinstate Monica

1
น่าเสียดายที่อุปกรณ์ไม่มีชื่อจำนวนมากทุกตัวมีหมายเลขซีเรียล "0123456789abcdef" นั่นคือสิ่งที่มันน่าสนใจ
mosvy

@mosvy ไม่สามารถเปลี่ยนหมายเลขซีเรียลได้หรือไม่
OganM

@OganM อาจมีการเปลี่ยนแปลง ... หากคุณสามารถรูทอุปกรณ์ได้
mosvy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.