在树莓派上,ttyUSB*
这类串口设备的编号在每次重启或者设备插拔后可能会发生变化,这是因为系统会根据设备的插入顺序动态分配编号。为了固定串口号,可以通过以下几种方法实现。一共有两种方法,一种是使用设备唯一标识符,一种是根据物理位置,两种方法各有优劣。如果说你的usb外设较多,或者使用了拓展坞扩展usb接口,且不用批量生产,建议使用方法一,他是识别插入模块的标识符实现串口编号的固定;如果你的产品要批量生产,由于每个外设的唯一标识符不一样,即使相同的两个传感器他们的标识符也不一样,为了便于批量生产安装,我们一般选择通树莓派上usb的位置(树莓派4B有4个usb接口)来固定他们的串口编号,后续只需要把外设插入到固定的usb口即可。
方法一:使用设备的唯一标识符(推荐)
每个 USB 设备都有一个唯一的标识符,你可以通过设备的 idVendor
和 idProduct
以及其他信息来创建一个指向特定串口设备的符号链接。
步骤:
- 查找设备的唯一标识符
使用lsusb
命令查看所有连接的 USB 设备及其idVendor
和idProduct
:
bash
lsusb
这会列出所有 USB 设备,找到你的串口设备对应的行,例如:
plaintext
Bus 001 Device 004: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
这里 0403
是 idVendor
,6001
是 idProduct
。
- 查找设备的路径
使用udevadm
命令查找设备的具体路径:
bash
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
将 /dev/ttyUSB0
替换为你的串口设备名称。在输出中查找 ATTRS{idVendor}
和 ATTRS{idProduct}
以确认是你要找的设备,同时注意 ATTRS{serial}
字段,它可能包含设备的序列号,这也是一个唯一标识。
- 创建 udev 规则
创建一个新的 udev 规则文件,例如/etc/udev/rules.d/99-usb-serial.rules
:
bash
sudo nano /etc/udev/rules.d/99-usb-serial.rules
在文件中添加以下内容:
plaintext
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="ttyUSB_MYDEVICE"
将 idVendor
和 idProduct
替换为你实际设备的值,ttyUSB_MYDEVICE
是你想要创建的符号链接名称。
- 重新加载 udev 规则
bash
sudo udevadm control --reload-rules
sudo udevadm trigger
现在,无论设备的 ttyUSB*
编号如何变化,你都可以通过 /dev/ttyUSB_MYDEVICE
来访问该串口设备。
方法二:根据设备的物理位置
如果设备的物理连接位置相对固定,你可以根据设备在 USB 总线中的位置来创建规则。
步骤:
- 查找设备的物理位置
使用udevadm
命令:
bash
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0) | grep "looking at device"
将 /dev/ttyUSB0
替换为你的串口设备名称。输出中会显示设备的物理位置信息,例如 1-1.3
。
- 创建 udev 规则
编辑/etc/udev/rules.d/99-usb-serial.rules
文件,添加以下内容:
plaintext
SUBSYSTEM=="tty", ATTRS{busnum}=="1", ATTRS{devpath}=="1.3", SYMLINK+="ttyUSB_MYDEVICE"
将 busnum
和 devpath
替换为你实际设备的值,ttyUSB_MYDEVICE
是你想要创建的符号链接名称。
- 重新加载 udev 规则
bash
sudo udevadm control --reload-rules
sudo udevadm trigger
这样,你就可以通过 /dev/ttyUSB_MYDEVICE
来稳定地访问该串口设备了。