
自动化测试工装做多了就会遇到一种特别实际的需求工装既要通过USB虚拟串口CDC和上位机保持双向通信又要模拟一把标准USB键盘往被测主机里敲工号和快捷键。如果做成两个独立USB设备主机上要插两根线、占两个USB口走线乱测试位一多管理也麻烦。后来我把方案改成USB复合设计Composite Design把CDC和HID键盘做进同一个USB设备一根线就同时具备两个功能。这篇文章把这个项目的完整设计过程、描述符代码、端点规划和踩坑记录都整理出来给同样要做USB复合设备的朋友一个可以直接抄作业的参考。1. 为什么我要把CDC和HID键盘塞进同一个USB设备1.1 场景还原一台设备要同时干两件事先说需求来源。我在做一套产线测试夹具夹具内部有一块控制板控制板上有一个USB口连接到被测主机。这个夹具要做三件事接收上位机下发的测试指令比如开始测试读取SN写入校准参数。把采集到的测试结果回传给上位机。按键模拟比如在特定步骤向被测设备输入一串快捷键或者输入工人工号、产品序列号模拟真实用户的操作。前两项用USB虚拟串口很自然也就是CDC类设备。第三项如果纯用CDC通道上位机软件还需要自己处理键盘输入注入在权限和兼容性上都有不少麻烦。更简单的做法是让控制板直接枚举成一个标准USB键盘按下按键时由系统输入子系统处理任何软件都能正常收到按键事件不需要额外适配。这种一个设备同时具备串口和键盘的需求并不只在测试工装里出现。医疗器械触控终端、POS机、工业HMI、扫码枪甚至一些定制化输入外设都常遇到类似的组合。最干净的解决方案就是把它们做成USB复合设备一个物理设备、一个USB口、一个设备地址但内部承载多个功能。1.2 复合设备和USB Hub插两个设备的本质区别刚开始有人建议我用一个带Hub的转接板Hub上插一个USB转串口模块和一个USB键盘模块。这样确实能实现功能但问题很多成本翻倍多了一颗Hub芯片和两颗USB控制器芯片。体积大工装内部空间本来就不富裕。主机端要识别成两个独立的USB设备管理和枚举都绕一圈。供电和信号完整性更容易出问题尤其是走线长的场景。USB复合设备Composite Device的做法则完全不同设备只有一个设备描述符、一个物理地址但在配置描述符里声明多个接口集合每个接口集合对应一个功能类。主机加载时会为同一个USB设备的多个接口分别绑定不同的驱动比如CDC ACM驱动绑定串口功能HID驱动绑定键盘功能。在Windows设备管理器里能看到一个USB复合设备父节点下面挂着USB虚拟串行端口(COMx)和HID键盘设备两个子功能节点。这一个父节点加两个子节点的结构就是复合设备在主机端的典型外观。1.3 为什么偏偏是CDC和HID这对组合选择CDC和HID最重要的原因是它们都有系统自带驱动。CDC ACMAbstract Control Model虚拟串口Windows从XP开始就原生支持Linux下对应usb acm驱动macOS也内置支持。H