Bảng liệt kê thiết bị Linux nhất quán


13

Trong hộp Linux của chúng tôi, chúng tôi có USB -> thiết bị nối tiếp luôn được xác định là /dev/ttyACM0 . Vì vậy, tôi đã viết một ứng dụng và cho đến ngày hôm qua, mọi thứ đều hoạt động tốt. Nhưng đột nhiên (vâng, trong khi trình bày từ xa ...) thiết bị đã ngừng hoạt động. Sau khi nghiên cứu nhanh, tôi thấy rằng kết nối đã thay đổi thành /dev/ttyACM1. Đó là một chút không kịp thời, nhưng bây giờ tôi có một vấn đề - làm thế nào để xác định rõ ràng thiết bị của tôi? Giống như, ví dụ, ổ lưu trữ có thể được khởi tạo bằng UUID mặc dù /dev/sd**đã thay đổi. Có một số cách để làm điều đó cho các thiết bị nối tiếp?

Bây giờ tôi sử dụng một cách giải quyết ngu ngốc:

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

Các liên kết đến thiết bị chúng tôi sử dụng.

Câu trả lời:


19

Vì chúng tôi đang nói về các thiết bị USB và giả sử bạn có udev, bạn có thể thiết lập một số quy tắc udev.

Tôi đoán, và đây chỉ là một phỏng đoán hoang dã, ai đó hoặc một cái gì đó đã rút / tháo thiết bị và cắm lại / thêm thiết bị một lần nữa, làm tăng số.

Bây giờ, trước tiên bạn cần id của nhà cung cấp và sản phẩm:

$ 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

Tiếp theo, bạn cần số sê-ri (trong trường hợp bạn có một số):

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

Bây giờ, hãy tạo quy tắc udev:

Các quy tắc UDEV thường được phân tán thành nhiều tệp trong /etc/udev/rules.d. Tạo một tệp mới được gọi 99-usb-serial.rulesvà đặt dòng sau vào đó, tôi có ba thiết bị, mỗi thiết bị có một số sê-ri khác nhau:

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

Nếu bạn không muốn số sê-ri, bất kỳ thiết bị nào từ nhà cung cấp có cùng chip sẽ nhận được cùng một liên kết tượng trưng, ​​chỉ một thiết bị có thể được cắm vào bất kỳ lúc nào.

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

Lấy từ đây


3
Nếu bạn có một bản phân phối linux gần đây, rất có thể nó đã tự động tạo ra thiết bị như /dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0. Điều này có thể là đủ cho bạn mà không có quy tắc udev tùy chỉnh.
Josef nói Phục hồi Monica

1
Thật không may, nhiều thiết bị không tên đều có số sê-ri "0123456789abcdef". Đó là nơi nó trở nên thú vị.
mosvy

@mosvy là số serial không thể thay đổi?
OganM

@OganM chúng có thể được thay đổi ... nếu bạn có thể root thiết bị.
mosvy 20/03/19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.