udev 是通過內核產生設備名增加別名的方式來達到 不管設備連接的順序而維持一個統一的設備名。內核通常會產生自定義的設備名 如sda1 sdb1等
,但是udev可以通過設備的其他信息如總線 ,生產商等不同來區分不同的硬件設備。在/etc的 目錄下。
例如 :ubuntu內核中,產生sda 設備名,可以通過制定 udev規則,讓udev 除了產生/dev/sda/ 設備文件外, 另外創建 一個符號鏈接叫 /dev/name ,這樣在ros串口處理的程序中,就 可以使用 產生的新的 設備名。
通過lsusb 命令可以查看到所有外接usb的接口設備的描述列表,可以得到id product和id VENDOR的數值,來進行後續的綁定。 ls /dev 可以查看所有 外接串口設備的名字列表。
首先 ,所有制定的udev 規則最終 會在 /etc/ udev /rule.d 這個文件夾下面 。
通過芯片的特定碼,來產生軟鏈接別名
可以一個腳本如下:
echo 'KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0666", GROUP:="dialout", SYMLINK+="dashgo"' >/etc/udev/rules.d/ch34x.rules
綁定 1a86 7523 的串口設備, 會在/etc/udev/rule.d 下 產生 相應的 規則文件,ttyUSB產生新的別名即 dashgo。
但是有時候, 很多廠商由於特殊原因,在串口芯片上,寫入的設備號的名字 都是一樣的。
所以要用到 另外一個辦法,就是通過綁定設備的硬件端口號 ,如下命令
echo 'KERNELS=="3-1.1", MODE:="0666", GROUP:="dialout", SYMLINK+="usb_0"' >/etc/udev/rules.d/usb.rules
會將硬件上屬於 3-1.1 的設備號映射到USB_0上 , 可以通過以下命令 查看 板子上的硬件端口的內核設備名 。
udevadm info --attribute-walk --name=/dev/ttyACM0 ;
該條命令會將 ttyACM0所對應的硬件端口的kernel設備名 顯現出來, 得到KERNEL== '1-5.5.4', 而不是之前的ttyUSB0,因爲這個在linux上插拔的時候,會根據先後順序來產生usb/acm0 ,usb/acm1 ,
所以我們 在利用該值 , 如上 在udev 添加端口設備規則進行串口的綁定,只不過綁定的是 具體的usb硬件對應的 KERNELS值。