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