使用USB转串口设备或多个USB转串口设备级联扩展多串口时,会经常遇到USB设备插拔顺序不固定、插入的USB主机口位置不固定、系统重新开机等操作导致设备对应串口号发生改变,影响产品使用的情况。
Windows系统固定串口号
在Windows系统上对于此需求推荐使用内置USB Serial Number(USB串行序列号)的USB转串口芯片,可实现同一物理设备在系统上分配的串口号固定不改变。原理如下:
Windows USB虚拟串口驱动的COM口分配一般均遵循以下原则:
- 针对USB描述符中内置USB Serial Number(USB串行序列号)的USB串口设备如CH343,默认系统会根据设备内置的SN编号,为其分配固定的COM口号,此时可以实现设备连接不同USB口时COM口均固定不变的效果,连接多个不同设备时因各芯片的USB Serial Number编号均不同,会分别对应生成不同的固定COM口。
- 针对USB描述符不包含USB Serial Number的USB串口设备如CH340和CH341,系统会根据设备的USB Location(USB位置)来分配COM口号,当连接不同的USB口时,因为USB端口的位置不同所以生成的COM口号也不同。
此外配合沁恒提供的专用串口号管理工具“ComPortManager”可轻松实现多设备的串口管理,可对指定设备或系统所有串口设备进行串口号一键管理,结合芯片内置USB Serial Number的特性,一次修改,永久生效。除此之外,还支持驱动安装时分配固定的串口号。
常用USB转多串口芯片:
型号 | CH347T | CH344Q | CH9344L | CH348L | CH348Q |
USB | 480M高速 | 480M高速 | 480M高速 | 480M高速 | 480M高速 |
串口数量 | 2 | 4 | 3 | 8 | 8 |
最高波特率 | 7.5Mbps | 6Mbps | 12Mbps | 6Mbps | 6Mbps |
IO电压 | 3.3V | 3.3V | 3.3V/2.5V/1.8V | 3.3V/2.5V/1.8V | 3.3V |
RS485控制 | √ | √ | √ | √ | √ |
封装 | TSSOP20 | LQFP48 | LQFP48 | LQFP100 | LQFP48 |
型号 | CH342F/K | CH9103M | CH344L | CH9104L |
USB | 全速 | 全速 | 全速 | 全速 |
串口数量 | 2 | 2 | 4 | 4 |
最高波特率 | 3Mbps | 3Mbps | 230400bps | 6Mbps |
IO电压 | 5V/3.3V/ 2.5V/1.8V | 5V/3.3V/ 2.5V/1.8V | 3.3V | 3.3V |
RS485控制 | CH342F支持 | √ | √ | √ |
封装 | QFN24/ESSOP10 | QFN40 | LQFP48 | LQFP48 |
ComPortManager软件介绍
Windows系统上可使用ComPortManager工具软件批量管理计算机串口设备COM口号,工具支持单独和批量修改系统下串口设备的端口号,支持USB转串口、PCI(e)转串口、BLE/以太网转串口等设备类型,支持设备的主动扫描和热插拔检测。串口更改支持2种方式:串口号依次递增或根据设备在系统下的物理位置进行分配。
串口号依次递增方式下对于每个多串口设备,更改成功后其第一个物理串口对应“起始串口号”,然后依次增加。如以下界面展示,目标设备为USB转4串口芯片CH344,指定起始串口号为COM10,则修改成功后与物理串口的匹配关系:UART0—>COM10、UART1—>COM11、UART2—>COM12、UART3—>COM13。
- 串口设备类型选择:USB转串口/PCI(e)转串口/BLE与以太网转串口/所有类型
- 枚举串口:主动搜索当前系统所有串口设备
- 串口卡排列顺序:按位置排列/按串口数量排列
- 串口设备信息栏
- 串口设备对应的COM口详细信息栏
- 需要更改的目标设备
- 指定串口号更改方式:依次递增/根据HUB位置的串口号设定更改
- 更改串口号:更改过程可能会与其他原有COM口冲突,需注意提示信息
- 软件信息输出窗口
- 设备详细信息栏
Linux系统固定串口号
Linux USB虚拟串口驱动的COM口分配一般均遵循以下原则:
Linux系统下的串口名称分配和硬件的上电顺序有关,如果是开机启动或者接在同一HUB下面,则由系统枚举各USB设备的顺序相关。先枚举成功的设备先进行串口名分配。如使用2个USB转8串口产品CH348,先插入系统的分配的为:ttyCH9344USB0~7,后插入的分配为:ttyCH9344USB8~15。
通过udev工具实现为USB转串口设备固定串口名称的实现原理与方法,该方法也适用于其他USB设备驱动。
udev运行在用户态,脱离驱动层的关联,基于这种设计实现,用户可以通过编写规则来动态删除和修改/dev下的设备文件,任意命名设备。除了设备重命名外,还拥有修改设备访问权限的功能,可以实现在普通用户模式下操作/dev下系统设备,无需root模式下进行。
每当udevd收到uevent事件时就会去匹配规则,匹配成功后执行规则对应的操作。用户自定义规则放到/etc/udev/rules.d/目录下,以rules为扩展名。
通过udevadm命令(udevadm info -a -n /dev/ttyCH343USB0)或者sysfs(ls -la /sys/class/tty)可以查看USB串口芯片详细信息,如下以双串口芯片CH342举例:
规则匹配主要基于几个字段:
KERNELS:kernel对设备的命名,此处为设备路径(Location ID)
ATTR/ATTRS:设备的属性,如idProduct/idVendor
SUBSYSTEMS:设备类型
ACTION:设备触发的操作,如add/change/remove
根据设备信息可在/etc/udev/rules.d/创建自定义规则usb-ch342.rules,内容如下:
注:DRIVERS信息为设备加载的驱动名,CH342支持VCP厂商驱动和CDC驱动类型,默认建议使用VCP驱动,DRIVERS为“ch343”,CDC驱动下DRIVERS为“cdc_acm”。
如上规则使用了设备的VID,PID与USB接口号。(每个物理串口分别对应一个USB接口)当使用多个USB转串口产品时可以通过设备的其他属性来区分设备:如插入主机的USB Location或者芯片的设备描述符等。通过命令:udevadm control --reload-rules && udevadm trigger让规则立即生效或重启后自动生效。
当CH342设备接入后即可在/dev下查看到SYMLINK中命名的ttyGPS与ttyBLE串口设备。若需要区分多个CH342设备,可结合KERNELS字段,即设备路径(Location ID)进行区分。
关于计算机端应用软件如何区分多个USB转串口设备,以及如何区分同一个USB转串口硬件的多个串口,可以移步至其他博客。