一、背景资料
- ROS 主控的 USB 接口连接 STM32 的 microUSB 接口,但是 STM32 上的microUSB 并非真正的 USB,而是一个 USB 转串口芯片。
- 面腾讯的机器人部门 Robotics X 的时候曾被问 ROS 主控是如何与 STM32 通信的,当时没实践过,没答上来,这里要好好做个记录。
- 笔者 STM32 主控板上的 USB 转串口芯片使用的是 CP2102。常见的 USB 转串口芯片还有 CH340,笔者没验证过 CH340,但道理应该是一样的。
二、更改 CP2102 的 serial
原因: ① 有两个串口,一个串口用于妙算2c 与 stm32 通信,另一个用于激光雷达和妙算2c 通信。CP2102 芯片默认的 serial 是 0001。 ② 笔者是通过编写 Linux 脚本,以 serial 来区别两个 USB 串口设备并固定设备名的。
方法: 需使用 Windows 下的软件CP21xx Customization Utility.exe 来修改 CP2102 芯片的 serial。 ① 首先在 Windows 双击安装 CP2102 驱动(不然下一步 ② 不识别) ② 将串口连接到 Windows 电脑的 USB 接口 ③ 打开软件,点击 Refresh,得到如下图(下图是 stm32 控制板上的串口)
约定:激光雷达的 serial 是0001,stm32 通信的 serial 设置为0002。
三、ROS 主控中创建设备别名
原因: ROS 主控通过串口收发数据时需要开发人员给 ROS 程序提供串口的设备名,以便程序能够使用该串口。但是串口设备名会因插拔顺序而改变,具体改变规则如下: ① 先插入激光雷达的串口,设备名为 /dev/ttyUSB0 ,后插入STM32的串口,设备名为 /dev/ttyUSB1 ② 拔掉 /dev/ttyUSB0 ,剩下STM32串口的设备名依然是 /dev/ttyUSB1 ③ 再插入激光雷达串口,这时激光雷达串口被赋设备名 /dev/ttyUSB0 。(并不是 /dev/ttyUSB2 ) ④ 先插入STM32的串口,设备名为 /dev/ttyUSB0 ,后插入激光雷达的串口,设备名为 /dev/ttyUSB1 。(与 ① 刚好相反,可见如果能记住插入顺序,其实这也不算个问题,但谁没事记这个啊,一切都要自动化!) 因此使用设备时,不用系统自动分配的设备名/dev/ttyUSBx 来操作设备。
1、相关 Linux 命令行
列出所有 USB 设备:
lsusb
下图执行三次lsusb ,执行时机分别为 没插串口——插上stm32的串口——插上激光雷达的串口
列出所有串口设备:
ls /dev/ttyUSB*
2、跟据串口 serial 创建设备别名的脚本
echo 'KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60",ATTRS{serial}=="0002", MODE:="0777", GROUP:="dialout", SYMLINK+="wheeltec_controller"' >/etc/udev/rules.d/wheeltec_controller.rules
echo 'KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60",ATTRS{serial}=="0001", MODE:="0777", GROUP:="dialout", SYMLINK+="wheeltec_lidar"' >/etc/udev/rules.d/wheeltec_lidar.rules
service udev reload
sleep 2
service udev restart
各个标签释义:
- KERNEL==“ttyUSB*” : 设备在内核的名称(由于是串口芯片,总线名称为ttyUSB*)
- ATTRS{idVendor}==“10c4” : 可在命令行使用
lsusb 查到的 ID 号(这个号码所有串口都一样) - ATTRS{idProduct}==“ea60” : 可在命令行使用
lsusb 查到的 ID 号(这个号码所有串口都一样) - ATTRS{serial}==“0002” : 内置在串口硬件中的设备序列号
- MODE:==“0777”
- GROUP:=“dialout”
- SYMLINK+=“wheeltec_controller” : 符号链接又称软链接(Linux中对应的概念还有硬链接)
无论内核分配的设备名是 ttyUSB 几,上述脚本都根据串口的内置 serial 将设备别名为wheeltec_controller
3、运行脚本
权限更改,使脚本具有可执行权限:
sudo chmod 777 wheeltec_udev.sh
在脚本所在路径运行该脚本:
sudo ./wheeltec_udev.sh
最后重启电脑使上述更改生效。(这里也卡了我有一会儿呢,改完之后查不到软连接,后来经百度,发现需要重启之后生效)
4、查看别名效果
精准查找:
ll /dev | grep ttyUSB*
软链接高亮的查找:
ll /dev
|