最近使用USB转4串口, 根据项目需求, 需要多个USB转串口的方案。 但是中途遇到问题, 发现串口每次插拔的顺序串口序号都会变动, 为解决该问题, 在LINUX下需要用到udev进行管理:
udevadm info -a -p /sys/class/tty/ttyUSB3
查看信息如下:
可以看到, 如果使用udev进行管理时, 由于UART串口序号和USB的vendor id, product id 不在同一个父设备中, 在做rules时, 不能直接将多个不同的父设备信息联用索引。 这里需要用到ENV来进行间接索引, 具体方法如下:
在/etc/udev/rules.d目录下创建usb_4uart_test.rules文件, 内容:
ATTRS{idProduct}=="55d2",ATTRS{1a86},ATTRS{idCustom}="000",ENV{para_var}="000"
ATTRS{idProduct}=="55d2",ATTRS{1a86},ATTRS{idCustom}="001",ENV{para_var}="001"
SUBSYSTEMS==“usb”,DRIVERS=="cdc_acm", ATTRS{bInterfaceNumber}=="00",ENV{para_var}=="000",MODE="0777",SYMLINK+="testUSB0"
SUBSYSTEMS==“usb”,DRIVERS=="cdc_acm", ATTRS{bInterfaceNumber}=="01",ENV{para_var}=="000",MODE="0777",SYMLINK+="testUSB1"
SUBSYSTEMS==“usb”,DRIVERS=="cdc_acm", ATTRS{bInterfaceNumber}=="02",ENV{para_var}=="000",MODE="0777",SYMLINK+="testUSB2"
SUBSYSTEMS==“usb”,DRIVERS=="cdc_acm", ATTRS{bInterfaceNumber}=="03",ENV{para_var}=="000",MODE="0777",SYMLINK+="testUSB3"
SUBSYSTEMS==“usb”,DRIVERS=="cdc_acm", ATTRS{bInterfaceNumber}=="00",ENV{para_var}=="001",MODE="0777",SYMLINK+="testUSB4"
SUBSYSTEMS==“usb”,DRIVERS=="cdc_acm", ATTRS{bInterfaceNumber}=="01",ENV{para_var}=="001",MODE="0777",SYMLINK+="testUSB5"
SUBSYSTEMS==“usb”,DRIVERS=="cdc_acm", ATTRS{bInterfaceNumber}=="02",ENV{para_var}=="001",MODE="0777",SYMLINK+="testUSB6"
SUBSYSTEMS==“usb”,DRIVERS=="cdc_acm", ATTRS{bInterfaceNumber}=="03",ENV{para_var}=="001",MODE="0777",SYMLINK+="testUSB7"
注意:
1) ATTRS{idCustom}="000"是客制化的参数, 由于芯片厂商没有芯片的唯一号, 我们需要自己根据厂商提供的工具增加相应参数, FTDI是提供相关工具的。这里最关键是使用ENV{para_var}做间接处理, 将不同的父设备信息联用。
2) 如果使用FTDI芯片,可到FTDI下载芯片编程软件, 实现ATTRS{idCustom}="000"的需求(实际ARRTS不叫idCustom, 这里只是举例)
.rules修改(或新增)保存后, 使用
udevadm control --reload
udevadm trigger
启用配置, 使用
ll /dev/testUSB*
查看效果