在linux使用串口读写数据时,经常面临插拔串口后需要重新给权限,还有可能串口的名字发生了改变,由ttyUSB0,发现变为了ttyUSB1,这时候又需要修改程序,很让人难受,所以我们必须要想办法把我插入的设备固定为一个串口名字,同时给 上权限。
下面介绍两种固定设备别名的方法:
第一种方法:
根据设备芯片的设备ID来确定插入设备的名字,比如设备插入的时USB转串口的串口助手,芯片是CH340,那么CH340的设备ID是固定的,我们根据这个芯片的设备ID来固定串口号:
首先查看设备硬件设备的ID号:
$lsusb
如下所示:
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 006: ID 046d:c31d Logitech, Inc. Media Keyboard K200
Bus 001 Device 005: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Bus 001 Device 004: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
Bus 001 Device 007: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 002: ID 1a40:0201 Terminus Technology Inc. FE 2.1 7-port Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
找到自己的串口是
Bus 001 Device 004: ID 10c4:ea60 Cygnal Integrated Products, Inc.
CP210x UART Bridge / myAVR mySmartUSB lightBus 001 Device 007: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial
adapter
我的两个串口一个是激光雷达rplidar A1,一个是USB转串口(CH340芯片)
我们可以看到雷达的ID是:10c4:ea60,USB转串口的ID是:1a86:7523
我们可以通过设备不同的ID来区分他们,只需在/etc/udev/rules.d/ 目录下创建usb规则文件即可
第一步:创建自定义rules,名字随便写,后缀是.rules
$sudo vim /etc/udev/rules.d/rplidar_port.rules
第二步:按照Udev规则写入rules
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="rplidar"
KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="serial_port"
对上面的规则进行分析
KERNEL==”ttyUSB*” kernel代表设备在内核的名称,ttyUSB*代表ttyUSB开头的USB端口总称
ATTRS{idVendor}==”10c4” "10c4"对应激光雷达串口模块端口信息中ID 10c4:ea60中:前的地址
ATTRS{idProduct}==”ea60” "ea60"对应激光雷达串口模块端口信息中ID 10c4:ea60中:后的地址
MODE:=”0777” MODE代表赋予串口端口的权限,"0777"是具体的权限
SYMLINK+=”rplidar” SYMLINK代表别名,"rplidar"=是具体的别名
第三步:重新插拔串口,就可以使用激光雷达的别名rplidar了
例如ROS,launch文件里的名字
type=“string” value="/dev/ttyUSB1"/>
改为
type=“string” value="/dev/rplidar"/>
第一个方法大功告成
第二钟方法:
linux设备的每个USB口的(KERNELS)是不同的且固定的,我们通过传感器接在固定USB口也可以避免串口号总是变动,比如雷达固定接USB1,IMU接USB2。
例如我的开发板有三个USB口,接下来我们分别看下三个USB对应的KERNELS分别是多少,这样我们就可以根据KERNELS来固定设备的名字了。假如使用电脑装的ubuntu时,每次只插入一个USB,会出现不同USB口KERNELS都一样的问题,需要注意。
第一步:只插入一个设备,随便插入到三个中的某一个。
第二步:查看设备插入后的名字
$ls -l /dev/ttyUSB*
如下所示:
zhao@ubuntu:~$ ls -l /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 7月 30 22:26 /dev/ttyUSB0
第三步:查看这个设备插入USB口的KERNELS
$udevadm info -a -n /dev/ttyUSB0
looking at parent device '/devices/pci0000:00/0000:00:15.0/0000:03:00.0/usb3/3-2':
KERNELS=="3-2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
可以看到 KERNELS==“3-2”
然后再依次查看其他USB口KERNELS分别为:
KERNELS==“3-3”
KERNELS==“3-1”
第四步:建立规则文件,给每个USB口取别名,USB口一一对应传感器
$sudo vim /etc/udev/rules.d/usb.rules
KERNELS=="3-2", MODE:="0666", GROUP:="dialout", SYMLINK+="RPLIDAR_A3"
KERNELS=="3-1", MODE:="0666", GROUP:="dialout", SYMLINK+="IMU"
重新加载udev规则
$service udev reload
$service udev restart
之后重新插拔USB
rule文件中#代表注释
备注USB常用操作
ls -l /dev |grep ttyUSB* 查看dev中所有的ttyUSB相关的
udevadm info -a -n /dev/ttyUSB0 方便查看到KERNELS
lsusb 查看所有的usb,但是应该查看的是插入的外设,查看范围较少,但是常用于查看usb的硬件设备地址
dmesg | grep ttyUSB* 查看dmesg中与ttyUSB相关的信息
dmesg查看所有的设备信息,包括内核的设备