序言
我常用树莓派作为上位机,来处理单片机无法完成的任务,在项目中,我们会难免需要两者建立通信。串口通信就是一个选择,然而串口设备端口号是不固定的,会导致每次运行程序前我们都需要寻找端口号。此教程是在树莓派ubuntu20上固定IP号的操作,最终结果会让任何设备插到固定USB口的端口号固定。
1、寻找USB的ID_PATH
在没有插入usb设备前执行:
lsusb
插入usb设备后再次执行:
lsusb
可看到如下结果:
其中多出的那个就是你插入的usb设备信息,我的是:
Bus 001 Device 013: ID 0483:5740 STMicroelectronics Virtual COM Port
网上大部分固定IP是使用ID c251:f001,但实际上不同的USB设备,它的ID是不同的,在这里我使用的是固定USB端口设备在树莓派中的设备路径.
输入以下命令(001与013 为上述获得的BUS和Device号,按实际修改):
udevadm info /dev/bus/usb/001/013
我们要获取的是设备的ID_PATH,即:
ID_PATH=platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.3
通过此方法查到ID_PATH仅代表该USB端口在连接关系,如果想要代表我们所插入的usb设备,需在后面添加 “:1.0”,即
platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.3:1.0
经测试,树莓派四个USB端口所连接的设备分别是:
platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.1:1.0 #右上角USB
platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.2:1.0 #右下角USB
platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.3:1.0 #座上角USB
platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.4:1.0 #左下角USB
- 对ID_PATH的解读
platform-fd500000.pcie-pci-0000:01:00.0
表示 USB 设备所连接的总线,可能是一个 PCIe 接口。usb-0:1.1:1.0
表示连接的端口和接口。具体而言,这个设备连接在总线的 0 号 USB 控制器上的 1 号端口,设备的接口编号为 1(在树莓派上还有2,3,4),子接口编号为 1。
2、修改配置文件
输入以下命令:
sudo vim /etc/udev/rules.d/myusb.rules #myusb.d是我自己创建的文件
添加以下内容
SUBSYSTEM=="tty", ENV{ID_PATH}=="platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.3:1.0", SYMLINK+="ttyUSBserial"
其中ID_PATH根据自己使用的树莓派USB端口修改,ttyUSBserial是我自己命名的固定端口。
重启后,执行以下命令:
ls -l /dev/tty*
可以看到以下内容
尝试在此USB插入其他类型USB设备,如下:
同样,我们配置的ttyUSBserial都会指向此USB端口插入的设备。
实际上,ubuntu的所有设备都是保存在/dev目录下的,在此目录下,你能够查看所有的USB设备名称:
3、测试
-
建立一个test.py文件,输入以下内容
import serial # 串口号和波特率 PORT = '/dev/ttyUSBserial' BAUDRATE = 9600 try: # 尝试打开串口连接 ser = serial.Serial(port=PORT, baudrate=BAUDRATE) # 如果成功打开串口,打印成功信息 print(f'Successfully opened serial port {PORT} at {BAUDRATE} baud.') # 关闭串口连接 ser.close() except serial.SerialException: # 如果打开串口失败,打印错误信息并退出脚本 print(f'Error opening serial port {PORT}.')
-
运行代码
python3 test.py
-
成功
可以关注完整的ROS小车搭建环境:
树莓派安装Ubuntu20 Server
树莓派ubuntu连接wifi及SSH登陆
树莓派ubuntu20配置静态IP
树莓派USB端口重映射与下位机串口通信
树莓派ubuntu20安装ROS
ROS分布式通信:树莓派与虚拟机