Cách kết hợp thiết bị ttyUSBX với thiết bị nối tiếp usb


21

trình điều khiển tùy chọn khớp chính xác ID USB và tải trình điều khiển cho thiết bị này. Ví dụ

# lsusb
Bus 001 Device 002: ID 19d2:0031 ONDA Communication S.p.A. ZTE MF636
Bus 001 Device 003: ID 12d1:14ac Huawei Technologies Co., Ltd.

Nó cũng tạo ra các thiết bị ttyUSBX để quản lý phần cứng

crw-rw---- 1 root uucp 188, 0 Jul  4 13:48 /dev/ttyUSB0
crw-rw---- 1 root uucp 188, 1 Jul  4 13:49 /dev/ttyUSB1
crw-rw---- 1 root uucp 188, 2 Jul  4 13:35 /dev/ttyUSB2
crw-rw---- 1 root uucp 188, 3 Jul  4 13:37 /dev/ttyUSB3
crw-rw---- 1 root uucp 188, 4 Jul  4 13:37 /dev/ttyUSB4
crw-rw---- 1 root uucp 188, 5 Jul  4 13:37 /dev/ttyUSB5
crw-rw---- 1 root uucp 188, 6 Jul  4 13:37 /dev/ttyUSB6
crw-rw---- 1 root uucp 188, 7 Jul  4 13:37 /dev/ttyUSB7

Tuy nhiên, tôi có nhiều hơn một thiết bị nối tiếp usb và tôi muốn biết ttyUSB dành cho USBID nào. Ví dụ. / dev / ttyUSB1 -> 19d2: 0031

Bạn có biết điểm nào tôi có thể nhận được thông tin này không?


Nếu bạn biết chi tiết như nhà cung cấp / sản phẩm, thì câu trả lời này rất hay
Earcam

Câu trả lời:


12

Có một cái nhìn vào hệ thống tập tin sysfs. Một ví dụ cho nối tiếp USB của tôi:

$ lsusb
Bus 003 Device 016: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
$ ls -l /sys/bus/usb-serial/devices
lrwxrwxrwx 1 root root 0 Jul  4 17:37 ttyUSB0 -> ../../../devices/pci0000:00/0000:00:1c.0/0000:02:00.0/usb3/3-1/3-1:1.0/ttyUSB0
$ $ grep PRODUCT= /sys/bus/usb-serial/devices/ttyUSB0/../uevent
PRODUCT=67b/2303/300

Như bạn có thể thấy, ttyUSB0bản đồ 067b:2303trên máy tính của tôi. Một địa điểm khác đáng để khám phá là /sys/class/tty/. Hãy chú ý đến các liên kết tượng trưng.


Bạn đã làm gì để làm cho nó liệt kê cả SẢN PHẨM?
Igor Stoppa

@IgorStoppa, Cố gắng catcác ueventtập tin từ kết quả của find /sys -name ttyACM0, ví dụ. Thay thế tên nút thiết bị nối tiếp của bạn.
sherrellbc

9

Bạn có thể thử xem (các) thiết bị của bạn đã được đăng ký dưới / dev / serial / by-id /

ls -l / dev / serial / by-id

Các tên này phải nhất quán và sẽ trỏ (symlink) tới ttyUSBx chính xác


Bạn có thể thêm một số làm rõ, ví dụ, vv Câu trả lời trực tuyến không được tính là tốt trong SE
Romeo Ninov

@RomeoNinov Ok, tôi đã thêm một số làm rõ khi bạn yêu cầu. Điều này thực sự không khó hơn so với việc chỉ nhìn vào một thư mục khác, vì vậy tôi không thể thấy cách làm cho câu trả lời phức tạp hơn nó sẽ cải thiện bất cứ điều gì. Xin lỗi vì điều đó.
Sáp

Tôi có hai bộ điều hợp giống hệt nhau (hai Arduinos) được kết nối với Raspberry Pi. ls -l /dev/serial/by-idchỉ trả về một bộ chuyển đổi ../../ttyUSB1, trong khi ls -l /sys/bus/usb-serial/deviceshiển thị cho tôi cả hai. Vì vậy, tôi không nghĩ rằng đây là một câu trả lời tốt.
Daniel F

6

Tôi đã có một vấn đề tương tự .

Viết cái này vào /etc/udev/rules.d/50-usb.rules

SUBSYSTEM=="tty", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="0031", SYMLINK+="ONDA"
SUBSYSTEM=="tty", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14ac", SYMLINK+="HUAWEI"

đến cuối cùng. Khởi động lại.

Bây giờ bạn có thể sử dụng /dev/ONDAđể truy cập thiết bị ONDA của mình.

Nếu bạn muốn người dùng không phải root có thể sử dụng chúng, hãy thêm

, MODE="0666"

đến cuối mỗi dòng.


Tôi đã làm điều này và kiểm tra các tập tin nơi họ liên kết đến. sản phẩm tôi có nhiều giao diện, như đĩa đặc, usb nối tiếp. Trong khi tôi mong đợi liên kết đến / dev / ttyACM0 nhưng nó là / dev / sda. Bất kỳ cách nào để xác định trong tệp quy tắc loại thiết bị nên áp dụng quy tắc? Tôi đã viết các quy tắc trong /etc/udev/rules.d/99-ftdi.rules
hãy nuôi dưỡng

ok tìm thấy nó: đã thêm SUBSYSTEM == "tty" vào các tham số quy tắc. giá trị này có thể được tìm thấy trong đầu ra của udevadm info --name=/dev/ttyACM0
Nuôi dưỡng

3

Tôi sẽ sử dụng udev và viết một số quy tắc tạo liên kết tượng trưng cho các thiết bị.

Để có đủ thông tin để phân biệt các thiết bị, hãy thử một cái gì đó như thế này cho tất cả các thiết bị:

$ udevadm info --query all --name /dev/ttyUSB0 --attribute-walk

1

Các lệnh sau sẽ cho tôi danh sách các tên thiết bị ttyUSB được liên kết với 19d2: 0016 (là id "chế độ modem" của thanh LTE ZTE MF831, tên của bạn có thể khác.):

    for i in $(find -L /sys/bus/usb/devices/ -maxdepth 2 -name "ttyUSB*"); do
        egrep -i "v19d2p0016(.*)in02" $i/../modalias >/dev/null && echo "/dev/${i##*/}"
    done

Điều này sẽ lặp qua danh sách các tệp có tên tệp ttyUSB *, bao gồm cả các liên kết tượng trưng, ​​trong / sys / bus / usb / thiết bị. Trong kết quả, chúng tôi sẽ tìm kiếm một tệp có tên modalias và tìm kiếm một chuỗi chứa id nhà cung cấp "v" "19d2" và id sản phẩm "p" 0016. Nếu đầu ra khớp, chúng tôi sẽ lặp lại một chuỗi có tiền tố "/ dev / "Trước USB? Tên. Afaik đầu tiên hoặc thường là cuối cùng (số cao nhất) là cổng modem cho các thiết bị ZTE. Bạn có thể lặp lại kết quả cho một tệp trong / tmp / và head -n1 hoặc tail -n1 các dòng tương ứng. Nếu bạn có hub, có lẽ bạn cần tăng maxdepth.

Đây không phải là cách thanh lịch nhất, nhưng nó sẽ hoạt động trên hầu hết mọi biến thể Linux.

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.