Ubuntu下因Udev规则导致FTDI串口设备接入时断开所有串口
解决FTDI设备Udev规则干扰其他串口的问题
问题核心
你当前使用的Udev规则通过全局卸载ftdi_sio和usbserial模块实现SDK通信,但这会导致所有串口设备断开。本质原因是:SDK依赖libftdi直接访问USB原始设备,不需要系统的串口驱动绑定,而全局卸载模块会影响所有依赖该驱动的设备。
可行解决方案
方案1:阻止特定设备绑定到ftdi_sio驱动(推荐)
使用Udev的PROBE指令,跳过当前设备的驱动探测,避免ftdi_sio绑定,同时不影响其他设备的驱动正常工作。替换原有规则为:
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0666", ENV{MODALIAS}="usb:v0403p6010d*dc*dsc*dp*ic*isc*ip*in*", PROBE="0"
PROBE="0":告诉Udev不要为该设备加载任何内核驱动,这样ftdi_sio不会绑定到它MODE="0666":保证SDK有足够权限访问USB原始设备节点- 其他设备的ftdi_sio驱动绑定不受影响,不会断开
方案2:仅解绑当前设备的驱动(备选)
如果方案1无效,可以通过sysfs仅解绑当前设备的ftdi_sio驱动,而非全局卸载模块。规则修改为:
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0666", RUN+="/bin/sh -c 'echo -n \"$kernel\" > /sys/bus/usb/drivers/ftdi_sio/unbind'"
$kernel是Udev内置环境变量,代表当前设备的内核路径,只会解绑当前设备的驱动,其他串口设备的驱动绑定不受影响- 同样保留
MODE="0666"确保SDK权限
验证步骤
- 替换
/etc/udev/rules.d/99-libftdi.rules中的原有规则 - 重新加载Udev规则:
udevadm control --reload-rules && udevadm trigger - 重新接入FTDI设备,检查:
- 其他串口设备(如ttyUSB0)是否仍正常存在于
/dev目录 - SDK是否能正常与FTDI设备通信
- 其他串口设备(如ttyUSB0)是否仍正常存在于
为什么SDK无需tty设备也能通信
SDK使用libftdi库直接通过USB总线访问设备(对应/dev/bus/usb/下的原始设备节点),不需要系统串口驱动生成的/dev/ttyUSB*设备。只要设备权限足够,即使没有tty节点,SDK也能正常工作。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

