如何为CP2105 USB转双串口设备分配带序列号的符号链接?
解决CP2105双UART设备的udev符号链接问题
我之前折腾过好多次CP2105的udev规则,这种单USB集成双UART的设备确实容易在符号链接配置上踩坑,给你整理几个靠谱的解决方案:
第一步:先确认设备的udev属性
首先得搞清楚两个串口设备的关键udev属性,插好开发板后,分别对两个/dev/ttyUSBx设备执行:
udevadm info -a /dev/ttyUSB0 udevadm info -a /dev/ttyUSB1
重点关注这几个属性:
ATTRS{idVendor}:CP210系列都是10c4ATTRS{idProduct}:CP2105对应ea60ATTRS{serial}:你的设备唯一序列号ENV{ID_USB_INTERFACE_NUM}:两个串口会分别显示不同的值(通常是00和01)
这是区分两个UART端口的核心依据——因为它们属于同一个USB设备,所以序列号、vid/pid都相同,只能靠接口编号来区分。
方案一:生成带序列号的端口专属符号链接
如果需要每个链接都包含设备序列号,避免多设备冲突,可以创建这样的规则:
创建/etc/udev/rules.d/99-cp2105-serial.rules文件,写入:
# CP2105双UART带序列号的符号链接 SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="ttyCP2105-$env{ID_SERIAL}-port0", MODE="0666" SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ENV{ID_USB_INTERFACE_NUM}=="01", SYMLINK+="ttyCP2105-$env{ID_SERIAL}-port1", MODE="0666"
解释:
- 用
ENV{ID_USB_INTERFACE_NUM}精准匹配两个不同的UART端口 $env{ID_SERIAL}会自动代入设备的序列号,生成类似/dev/ttyCP2105-ABC123XYZ-port0的链接MODE="0666"确保普通用户也能访问串口
方案二:生成固定编号的符号链接(绑定特定设备)
如果不需要带序列号,只想给特定设备生成固定名称的链接,比如/dev/ttyCP2105-port0,可以加上序列号绑定:
创建/etc/udev/rules.d/99-cp2105-fixed.rules文件,写入:
# CP2105双UART固定编号符号链接(绑定特定设备) SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="你的设备序列号", ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="ttyCP2105-port0", MODE="0666" SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="你的设备序列号", ENV{ID_USB_INTERFACE_NUM}=="01", SYMLINK+="ttyCP2105-port1", MODE="0666"
如果不需要绑定特定设备(比如只有一块CP2105开发板),可以去掉ATTRS{serial}=="你的设备序列号"这一行,但多设备场景下会出现链接冲突,不推荐。
为什么之前的规则可能失效?
大概率是这两个原因:
- 没区分接口编号:只匹配了vid/pid,导致两个UART设备都触发同一条规则,生成重复的符号链接,udev会自动跳过重复创建,最终只生成一个链接
- 属性层级错误:比如误用了
ATTR{serial}而非ATTRS{serial}——ATTR匹配当前设备的属性,而CP2105的序列号是在父USB设备上,必须用ATTRS(注意末尾的S)来匹配父设备属性
规则生效方法
写完规则后,执行命令重新加载udev规则:
udevadm control --reload-rules
然后拔插开发板,用以下命令检查符号链接是否生成:
ls -l /dev/ttyCP2105*
另外你提到的那条阻止其他驱动的有效规则,可以和上面的规则合并,比如在规则里加上DRIVER=="cp210x",确保只匹配CP210x驱动识别的设备,避免其他驱动干扰。
内容的提问来源于stack exchange,提问作者Staszek




