多个USB转串口设备区分方法
概述
当计算机或者其他USB主机上使用多个USB转串口设备时,会遇到多个串口无法与具体的串口设备对应起来的问题,包括更换不同USB端口串口序号发生改变,多个设备USB插拔顺序不同导致串口序号改变等问题。
本文提出几种常见解决方式,用于解决开发及使用过程中遇到的问题。部分方法同样适用于单个USB串口设备连接的场景。
一、USB设备硬件信息不同
当使用不同厂家的USB转串口芯片或同一厂家不同系列的USB转串口芯片,可使用以下几种常用方法用于区分多个设备。
- 通过USB设备描述符中设备信息
USB厂商ID、USB产品PID、USB厂商字符串、USB产品字符串、串行序列号等
- 通过虚拟串口驱动生成的设备名称
当使用不同的VCP厂商驱动或类驱动时,串口设备名称会有区别。如:
Windows操作系统使用USB转串口芯片CH340和CH343时,设备管理器信息:
Linux操作系统下分别生成ttyUSB设备和ttyACM设备(当CH343使用系统自带CDC串口驱动时)。
Android系统下进行免驱USB应用开发,可直接调用UsbDevice类提供的接口函数。
- 通过VCP厂商驱动提供的应用层接口
如使用CH340芯片及驱动时,可通过沁恒提供的动态库及API接口函数来判断当前操作的串口是否为CH340或CH341。
Windows系统下动态库CH341PT.DLL,接口函数:CH341PtNameIsCH341、CH341PtHandleIsCH341。除此之外,该动态库还提供USB热插拔检测等功能。当使用新一代USB转串口芯片CH342/CH343/CH344/CH9101/CH9102/CH9103时可使用CH343PT.DLL进行设备识别以及获取芯片相关信息等。
二、USB设备硬件信息相同时
当使用USB硬件信息完全相同的USB转串口芯片,可使用以下几种常用方法用于区分多个设备。
- 通过串口MODEM信号线
通常USB转串口芯片,除提供TXD和RXD异步串口信号,还支持MODEM联络信号RTS、DTR、DCD、RI、DSR、CTS等。其中RTS与DTR信号可用作通用输出信号,CTS、DSR、RI、DCD信号可用作通用输入信号。可利用输入信号或输入与输出信号的组合来区分不同串口设备。
除了可以作为通用输出输入功能的MODEM信号引脚外,一些USB转串口芯片还额外提供了GPIO引脚,也可以用于如上组合检测,比如:CH9102、CH9101、CH9103、CH9344等。
- 使用输入信号
在设备上电工作前根据需要将相应输入信号置高或拉低。操作串口时,主动获取MODEM输入信号的电平状态,根据状态区分串口设备。如:当使用4路输入信号的组合,最多可以区分2的4次方 = 16种串口外设。
- 使用输出与输入信号的组合
在设备上电工作前根据需要将输出信号与输入信号短接(可1对1,也可以1对多)。操作串口时,置高或拉低MODEM输出信号,然后读取与其短接的输入信号的电平状态,根据状态是否同步区分硬件。如:短接DTR和DSR信号,先置低DTR,读取DSR是否为低。再置高DTR,读取DSR是否同步为高。
- 通过串口应用协议
串口通信双方可事先约定好通信协议,通过串口数据内容来确认串口设备的“身份”。比如同一台计算机下需要接入多台串口设备,约定身份确认通信格式为:
计算机:包头+获取身份命令码+包尾+校验
设备:包头+身份ID+包尾+校验
当需要与其中某个具体串口设备通讯前,可先按照通信命令发送数据包,等待设备回复后,提取“身份ID”用于计算机确认设备“身份”。
三、如何选型与设计
尽管USB转串口芯片内置信息相同或者不同时均有对应的处理方案,但如上各方法需要依赖于硬件设计和软件设计,在产品设计前均要提前合理规划。
总结与建议:
- 操作多个USB设备信息不同的芯片的便利在于,同一芯片型号的硬件设计可以完全相同,不需要管理多套硬件。此时建议选用支持USB配置功能的USB串口芯片。如:CH342F、CH343P、CH9102F、CH9103M、CH9101U/H、CH340B等,使用厂商提供的专用配置工具可以灵活配置芯片内部相关信息。
- 当使用串口应用协议区分时,需要遍历操作系统下各个串口,当设备处于独占状态下会存在串口无法打开的情况。
- 当使用MODEM信号或GPIO信号用于区分多个串口设备时,需要在硬件设计阶段将相应信号管脚连接起来。应用软件同样需要遍历操作各串口。