最近遇到一个问题,就是由于我需要插多个串口设备在树莓派上进行读取数据,但是如果是先插上STM32上报数据的串口,得到的串口号为/dev/ttyUSB0,而再插激光雷达的串口,得到的串口号为/dev/ttyUSB1。But!反过来顺序插的话串口号就变了!!!每次修改配置文件太难受了!因此,如果有一种可以把我们的串口映射到一个别名上,那该多好啊!!!Don't worry!方法总比困难多!接下来记录下修改串口的具体步骤!
目录
一、查看串口号
二、编写规则文件
三、重加载和重启
四、其他问题
一、查看串口号
lsusb
我们可以发现第二行就是我们插的CP2102串口芯片显示的相关信息~
Bus 001 Device 003: ID 10c4:ea60 Silicon Labs CP210x UART Bridge
二、编写规则文件
我们需要进入以下的路径创建规则文件:
cd /etc/udev/rules.d/
创建一个规则文件:
sudo vim robot_base.rules
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="robot_base"
KERNEL:设备在内核的名称(由于我们是串口芯片,总线名称为ttyUSB*)
ATTRS{idVendor}以及ATTRS{idProduct}:id号(我们刚刚查看的lsusb里面那一块ID号)
也可以运行以下命令查看:
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
kernel写这样也可以滴!
MODE:权限,(7代表设置读、写、执行权限,3个7代表给所有用户、群组用户、其他用户都设置可读可写可执行的权限)
r(读) | 4 |
w(写) | 2 |
x(执行) | 1 |
SYMLINK:设置别名(我设置的为robot_base)
三、重加载和重启
重新加载udev
sudo service udev reload
重启udev
sudo service udev restart
查看下最终映射情况
ll /dev | grep ttyUSB
我们可以看到robot_base 映射到 ttyUSB0
因此我们只需在我们设置串口端口时写为如下即可:
之前是这样写的:
这样就好啦!
四、其他问题
还没有结束……设置完一个后,发现我TM两个串口芯片都是CP2102……芯片ID号都一致。裂开了……(如果是不同芯片上面的方法是可以区分开的!)这该咋整!
通过查询USB具体信息,我发现一个地方可以区分开,那就是端口!!(这个端口就是我们字面的意思,不同的插口!)
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
也就是我们只要记住我们的设备是固定插哪个端口,就能区分串口号啦!
接下来修改下我们的规则~
robot_base.rules:
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60",ATTRS{devpath}=="1.2", MODE:="0777", SYMLINK+="robot_base"
rplidar.rules:
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{devpath}=="1.1", MODE:="0777", SYMLINK+="rplidar"
然后重新加载和重启即可~!
我们测试一下~!
我再调转下插接先后顺序!
我们可以发现,不管我们先后插哪个设备,都可以映射到我们想要的串口!!