Usb
如何在連接時為串列設備提供自定義名稱?
我正在Odroid XU3(ARM 開發板)上的Ubuntu 14.04下研究ROS 。
我將兩個 USB 設備連接到我的開發板,根據它們連接的時間,它們被辨識為ttyACM0和ttyACM1 。
由於這些設備(Arduino 和 PixHawk)具有不同的 PID / VID,我想將它們綁定到某個“自定義名稱”tty,例如ttyController0和ttyPosition0。
根據這個主題,我們可以根據 PID 和 VID 將設備simlink 到ttyUSB0。
我應該如何模擬連結到確定性名稱?
/etc/udev/rules.d/99-custom.rules
simlink中的 4 條規則會起作用嗎?ACTION=="add", ATTRS{idVendor}=="0123", ATTRS{idProduct}=="0001", RUN+="/bin/ln -s /dev/ttyACM0 /dev/ttyController" ACTION=="remove", ATTRS{idVendor}=="0123", ATTRS{idProduct}=="0001", RUN+="/bin/rm /dev/ttyController" ACTION=="add", ATTRS{idVendor}=="3210", ATTRS{idProduct}=="0002", RUN+="/bin/ln -s /dev/ttyACM0 /dev/ttyPosition" ACTION=="remove", ATTRS{idVendor}=="3210", ATTRS{idProduct}=="0002", RUN+="/bin/rm /dev/ttyPosition"
或者我可以使用帶有自定義 PID 和 VID 的 Udev 嗎?
您的配置應該基本上可以工作,但我想提出一些建議:
首先,我認為您想使用
ATTR
,而不是ATTRS
.ATTRS
向上搜尋整個設備樹到匹配的(父)設備。這很可能不是您想要的。使用ATTR
實際觸發事件的設備必須具有指定的屬性。其次,由於創建到設備節點的符號連結是一項相當常見的任務,因此有一個專門的聲明來執行此操作,即
SYMLINK+="newname"
. 這樣您就不會依賴“外部”命令。更重要的是,通過使用此指令,您只需要匹配“添加”事件,因為udevd
當設備消失時會自動刪除關聯的符號連結。因此,您的規則應該是
ACTION=="add", ATTR{idVendor}=="0123", ATTR{idProduct}=="0001", SYMLINK+="ttyController" ACTION=="add", ATTR{idVendor}=="3210", ATTR{idProduct}=="0002", SYMLINK+="ttyPosition"
最後,我建議通過添加進一步的 SUBSYSTEM 約束來縮小匹配範圍,即添加
SUBSYSTEM=="usb"
. 由於設備和供應商 ID 僅(希望)在其範圍內是唯一的,因此忽略子系統匹配可能會導致您的規則與其他設備類(如 PCI 設備)匹配。儘管這不太可能,但它通常被視為 udev 規則中的好樣式:SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="0123", ATTR{idProduct}=="0001", SYMLINK+="ttyController" SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="3210", ATTR{idProduct}=="0002", SYMLINK+="ttyPosition"