摘要:USB CDC 设备插上 Windows,设备管理器里出现“未知设备”或“CDC ACM 设备”?不是代码不行,而是 VID/PID 未被 Windows 内置驱动识别,或 INF 文件配置错误。本文解析 CDC 虚拟串口的驱动匹配机制。


一、问题描述(现象)

**MCU 跑 CDC 例程,Linux 下直接识别为 /dev/ttyACM0;

Windows 下却提示“未能安装设备驱动程序”;

手动指定 usbser.sys 后,COM 口还是出不来。**

很多工程师的排查方向是:

  1. 是不是 VID/PID 冲突了?

  2. INF 文件路径不对?

  3. 换个 USB 线试试?


二、原理分析

1. 物理模型

USB 设备的识别流程:

插入设备 -> Windows 读取 VID/PID ->
查找匹配的 INF -> 加载驱动 (usbser.sys) ->
创建 COM 口

2. 核心参数

  • VID (Vendor ID):厂商 ID(如 0x0483 是 ST)。

  • PID (Product ID):产品 ID。

  • INF 文件:告诉 Windows 谁来驱动这个 VID/PID。

3. 反直觉真相

Windows 和 Linux 对待 CDC 的态度完全不同。

  • Linux:内核自带 CDC ACM 驱动,看到 VID/PID 就直接加载,无需 INF。

  • Windows

    • 只有 特定的 VID/PID(如 ST、TI、NXP 的默认 PID)才会自动加载 usbser.sys

    • 自定义的 VID/PID,Windows 完全不认识,必须手动提供 INF。


三、工程级解决方案

方案 1:修改 INF 文件(最常用)

Windows 自带 usbser.sys,你只需要一个 INF 告诉它“这个 VID/PID 归你管”。

关键字段:

[Standard.NT]
%DESCRIPTION%=DriverInstall, USB\VID_XXXX&PID_YYYY

操作步骤:

  1. 找到 Windows 自带的 mdmcpq.infusbser.inf

  2. 复制一份,修改其中的 VID/PID 为你自己的。

  3. 右键安装 INF。

方案 2:使用 ST / TI 的 VID/PID(取巧)

如果你的 MCU 是 ST 的(如 STM32):

  • 使用 ST 默认的 VID (0x0483) 和 PID (如 0x5740)。

  • Windows 内置了 ST 的 CDC 驱动,插上即用。

注意:量产产品不建议这样做,VID 需要向 USB-IF 缴纳年费购买。

方案 3:强制绑定(高级)

使用 devcon命令行工具强制绑定驱动。

devcon install usbser.inf USB\VID_XXXX&PID_YYYY

四、选型避坑建议

  1. 不要乱改 VID

    • 0x0000 ~ 0x0FFF 是保留地址。

    • 0x0403 是 FTDI(经常被误用)。

  2. PID 必须唯一:同一 VID 下,不同产品要用不同 PID。

  3. Windows 10+

    • 原生支持 CDC ACM,但前提是 INF 必须正确。

    • 不再支持旧的 usbser.sys手动复制方式。


五、总结 Checklist

  • [ ] 是否确认 Windows 是否内置了该 VID/PID 的驱动?

  • [ ] INF 文件中的 VID/PID 是否与描述符完全一致?

  • [ ] 是否尝试过手动更新驱动并指向 INF?

  • [ ] 设备管理器里是否显示为“CDC ACM”还是“未知设备”?


六、写在最后(关注我,少走弯路)

我是 gqqsherry,一个拒绝调包、专注底层逻辑的嵌入式工程师。

USB CDC 的坑在于“跨平台差异”:Linux 下是天堂,Windows 下是考场。

关注我的专栏《嵌入式底层避坑指南》,我会持续更新 USB、CAN、UART 等外设的真实调试案例量产级解决方案

👉 下一篇预告:《USB 速度跑不满?别只怪 DMA,看看端点(Endpoint)配置与 FIFO》


References

  • Microsoft Docs – USB CDC ACM driver (usbser.sys)

  • USB-IF – Vendor ID application process

  • ST Microelectronics – Custom USB CDC INF file example


如果你在 Windows 下调试 CDC 时遇到过“INF 怎么改都黄叹号”的情况,欢迎在评论区晒出你的 VID/PID。

原创文章,转载请注明出处。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐