使用串口设备的时候系统会随机分配设备名称,为了使用串口通信的时候不改代码,可以对其进行绑定。
查看自己设备的dVendor
和idProduct
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 0bda:565a Realtek Semiconductor Corp. Bus 001 Device 004: ID 27c6:538c
Bus 001 Device 003: ID 248a:8367
Bus 001 Device 006: ID 8087:0aaa Intel Corp.
Bus 001 Device 016: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
我们可以看到ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter Bus
,即dVendor
为1a86
,idProduct
为7523
。
创建一个脚本
$ touch usb_rename.sh
$ gedit usb_rename.sh
在文件中添加如下内容
echo 'KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="2303", MODE:="7523", GROUP:="dialout", SYMLINK+="stm32base"' >/etc/udev/rules.d/usb_rename.rules
service udev reload
sleep 2
service udev restart
运行脚本
$ sudo sh usb_rename.sh
最后
将设备拔下在插上,就可以查看效果
$ ls -l /dev |grep ttyUSB
lrwxrwxrwx 1 root root 7 4月 28 12:22 **stm32base -> ttyUSB0**
crwxrwxrwx 1 root dialout 188, 0 4月 28 12:22 ttyUSB0
在ros中使用设备名称
rosrun rosserial_python serial_node.py /dev/stm32base
另外还有
很多厂商由于特殊原因,在串口芯片上,写入的设备号的名字 都是一样的,没有办法区分。所以要用到另外一个办法,就是指定的硬件端口的名称,即从这个usb口插入的设备名称会固定。
首先查看设备的具体信息
$ udevadm info --attribute-walk --name=/dev/ttyUSB0
looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/ttyUSB0':
KERNEL=="ttyUSB0"
SUBSYSTEM=="usb-serial"
DRIVER=="ch341-uart"
ATTR{port_number}=="0"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0':
KERNELS=="1-1:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="ch341"
ATTRS{authorized}== "1"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bInterfaceClass}=="ff"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bInterfaceProtocol}=="02"
ATTRS{bInterfaceSubClass}=="01"
ATTRS{bNumEndpoints}=="03"
ATTRS{supports_autosuspend}=="1"
可以看到KERNELS=="1-1:1.0"
,将上文脚本中的KERNEL=="ttyUSB*"
替换为KERNELS=="1-1:1.0"
即可