3.7 linux系统下串口设备和串口号绑定
3.7.1 问题由来
在ROS小车的开发过程中,需要使用ROS通信串口模块、激光雷达的串口模块、IMU的串口模块等,为了防止每次开机这些设备的串口号发生变动,所以需要对串口号与串口设备绑定;为了更好的识别串口,我们也可以对串口号进行设置静态名称;为了更好的使用串口,我们也可以对串口进行权限设置。
一次设置,终身受益。
3.7.2 原理
在linux系统下,虽然每一个固定的端口可能由于外接设备启动的时间差异分配的ttyUSB*不同,但是对于每一个固定的端口,都有固定的 KERNELS、idProduct、idVendor,并且每一个端口的KERNELS都不相同。
所以,我们只要固定串口设备的安装位置,还是可以从端口物理性质的不同解决这个问题。
3.7.3 方法
第一步:如何查询每一个端口的KERNELS、idProduct、idVendor?
这里需要使用下面这条命令
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
并且当每次独立插入一个串口设备时,串口号总为/dev/ttyUSB0,若不放心,可以使用下面命令查询
ls /dev | grep ttyUSB
使用第一条命令,窗口将打印一堆设备信息,我们只需要KERNELS、idProduct、idVendor,我们向下滑找到类似下图的部分找到该端口的信息。
注意:查询端口信息时,请单独插入串口设备。
第二步:在/etc/udev/rules.d/目录下创建自己的99-*.rules文件
比如这里创建99-robot-usb.rules文件,使用如下命令
sudo vim /etc/udev/rules.d/99-robot-usb.rules
填入如下内容,保存,根据自己设备的信息填写
KERNELS=="3-2", ATTRS{
idVendor}=="1a86", ATTRS{
idProduct}=="7523", SYMLINK+="robot",MODE:="0777"
对上述的解释
“==”:比较键、值,若等于,则该条件满足;
“+=”:为一个表示多个条目的键赋值。
“:=”:对一个键赋值,并拒绝之后所有对该键的改动。目的是防止后面的规则文件对该键赋值。
第三步:重启并查看配置是否生效
重启
sudo reboot
等待开机,查看端口
ll /dev | grep ttyUSB
中断打印出如下信息,设置成功
lrwxrwxrwx 1 root root 7 Sep 20 22:30 robot -> ttyUSB0
crwxrwxrwx 1 root dialout 188, 0 Sep 20 22:30 ttyUSB0
之后我们再使用该物理位置的端口时,它的串口号就固定为 /dev/robot,并且具有可读可写可执行的权限。
注意事项:
以上只是对一个端口设置的流程,大家在多数情况下都是多个设备。聪明的你,一定知道怎么举一反三。
每次独立插入一个串口设备,获得它的KERNELS、idProduct、idVendor值,记录下来;在/etc/udev/rules.d/目录下创建自己的99-*.rules文件,一次性填入这些设备的信息以及你需要的映射的名字;然后重启即可。
以往链接,点击访问。
上一篇:搭建ROS小车编写启动功能包
系列文章:从零搭建ROS机器人
如果你感觉,我的文章比较适合你,关注我,点个赞,给你不一样的惊喜。