Ubuntu USB設備號爲從零開始依次累加,當多個設備連接PC時,出現設備號不固定現象,要求工控機每次開機都需要按順序插。爲了解決這一現象,需要綁定USB端口號。
有一種方法是:udev的規則,可以參考博客說明:http://blog.csdn.net/cokewei/article/details/8281239
udev的規則說明,可以參考博客說明:http://blog.csdn.net/cokewei/article/details/8281239
將端口重映射到新的固定的名字,並且設置其權限爲可讀。使用對應的id端口映射到固定的名字上。
1 |
|
查看對應的usb端口信息
1 2 3 4 5 6 |
|
ID 1a86:7523 表示usb設備的ID(這個ID由芯片製造商設置,可以唯一表示該設備)
1a86 usb_device_descriptor.idVendor
7523 usb_device_descriptor.idProduct
2.在/etc/udev/rules.d/下創建任意名稱的規則配置文件,如:usb.rules。
sudo vi /etc/udev/rules.d/usb.rules
KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="usb"
保存完成後,以root權限打開終端執行
service udev reload
service udev restart
創建生效後重新插拔USB.
3.查看串口設備生成的符號鏈接。
4.創建生效後重新插拔USB
1 |
|
工控機連接兩個usb串口,一個是rplidar,所對應的是ttyUSB1;另外一個是usb,所對應的是ttyUSB0。
非常尷尬的是,重新啓動工控機時,不知道usb先啓動,還是rplidar先啓動?哪個先啓動,哪個就是ttyUSB0。
終極版(2019年6月27日改):
現在終於搞定了 。爲了不讓我們的usb設備在使用時,由於設備節點註冊的ID不同,設備名稱會不同,設備如何在 Linux 中永久修改 USB 設備權限。
1.創建一個腳本文件
touch create_dashgo_udev.sh
gedit create_dashgo_udev.sh
2. 在文件中添加如下內容
echo 'KERNEL=="ttyUSB*", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", MODE:="0777", GROUP:="dialout", SYMLINK+="keysi_base"' >/etc/udev/rules.d/keysi_base.rules
service udev reload
sleep 2
service udev restart
3.查看自己設備的idVendor和idProduct
lsusb -vvv
上面lsusb的輸出中,找出你的 USB 設備,並找出"idVendor"和"idProduct"字段。本例中,我們的結果是idVendor (0x067b)和 idProduct (0x2303)。修改上面的create_dashgo_udev.sh文件
udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB0
SUBSYSTEMS=="usb"
DRIVERS=="cp210x"
ATTRS{bInterfaceClass}=="ff"
ATTRS{bInterfaceSubClass}=="00"
ATTRS{bInterfaceProtocol}=="00"
ATTRS{bNumEndpoints}=="02"
ATTRS{supports_autosuspend}=="1"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bInterfaceNumber}=="00"
ATTRS{interface}=="CP2102 USB to UART Bridge Controller"
KERNEL=="ttyUSB*", KERNELS=="1-2.1", MODE:="0777",SYMLINK+="slamtec_base_"
KERNEL=="ttyUSB*", KERNELS=="1-2.2", MODE:="0777",SYMLINK+="slamtec_laser_"
像我們公司的串口找不到 idVendor和idProduct的話,可以
lsusb
4. .運行腳本
sudo sh create_dashgo_udev.sh
5.查看效果
ls /dev/keysi_base
6.在代碼中使用設備名稱
<param name="usart_port" type="string" value="/dev/keysi_base"/> <param name="baud_data" type="int" value="115200"/> <param name="robot_frame_id" type="string" value="base_link"/>
7.在linux串口工具cutecom中可以查看下位機發送的數據
參考博文:http://www.cnblogs.com/zxouxuewei