如何为Zephyr USB CDC ACM设备分配唯一COM端口以实现一致识别?
解决Zephyr USB CDC ACM设备固定COM端口问题
问题背景
Zephyr项目中的USB CDC ACM设备每次连接不同USB接口时,主机分配的tty.usbmodemXXX端口名会动态变化,需要实现固定端口名以便其他应用持续查询。
解决步骤
1. 给Zephyr设备配置唯一USB标识
主机通过USB设备的厂商ID(VID)、产品ID(PID)和序列号识别唯一设备,需在Zephyr中配置这些固定值:
方式一:修改设备树
在现有设备树节点下添加USB描述符配置:
&zephyr_udc0 { cdc_acm { compatible = "zephyr,cdc-acm-uart"; label = "CDC_ACM"; status = "okay"; }; usb_device_descriptor { vendor-id = <0x1234>; /* 替换为你的厂商ID,正式产品需用USB-IF合法ID */ product-id = <0x5678>; /* 替换为你的产品ID */ serial-number = "MY_ZEPHYR_CDC_001"; /* 全局唯一序列号,批量生产可绑定硬件ID */ product = "Zephyr CDC ACM Device"; manufacturer = "My Company"; }; };
方式二:通过prj.conf配置
在项目配置文件prj.conf中添加:
CONFIG_USB_DEVICE_VID=0x1234 CONFIG_USB_DEVICE_PID=0x5678 CONFIG_USB_DEVICE_SERIAL_NUMBER="MY_ZEPHYR_CDC_001" CONFIG_USB_DEVICE_MANUFACTURER="My Company" CONFIG_USB_DEVICE_PRODUCT="Zephyr CDC ACM Device"
2. 主机端(Linux)配置udev规则绑定固定端口
即使设备有了唯一标识,主机默认仍会分配动态端口名,需通过udev规则创建固定软链接:
- 创建udev规则文件:
sudo touch /etc/udev/rules.d/99-zephyr-cdc.rules
- 编辑文件并添加以下规则(替换成你设置的VID、PID和序列号):
SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", ATTRS{serial}=="MY_ZEPHYR_CDC_001", SYMLINK+="ttyZephyrCDC"
- 规则含义:匹配指定VID/PID/序列号的tty设备,创建
/dev/ttyZephyrCDC软链接作为固定端口名
- 重新加载udev规则生效:
sudo udevadm control --reload-rules sudo udevadm trigger
验证
重新连接设备后,即可通过/dev/ttyZephyrCDC访问CDC ACM端口,无论连接哪个USB接口,该名称保持不变。
内容的提问来源于stack exchange,提问作者surus
相关产品推荐
相关产品推荐

