CDC/ACM 全称是 Communication Device Class / Abstract Control Model(通信设备类 / 抽象控制模型),它是 USB 官方定义的一种标准协议,用于将 USB 设备模拟成虚拟串口(Virtual COM Port)


拆解理解

CDC (Communication Device Class)

  • 通信设备类:USB 组织(USB-IF)定义的一个大类,用于各种通信设备

  • 包含范围:电话、调制解调器、网卡、ISDN 终端、串口设备

  • 核心作用:规范通信设备如何通过 USB 与主机交换数据

ACM (Abstract Control Model)

  • 抽象控制模型:CDC 类下的一个子类(Subclass)

  • 专门用途串口仿真(Serial Emulation)

  • 关键特性:让 USB 设备在电脑上显示为一个标准的串口(COM 端口),就像传统的 RS-232 串口一样


CDC/ACM 设备的工作原理

CDC/ACM 设备通过两个接口实现通信:

┌─────────────────────────────────────────┐
│           CDC/ACM USB 设备              │
├─────────────────────────────────────────┤
│  1. 通信类接口 (CCI - Communications    │
│     Class Interface)                    │
│     • 管理设备配置和控制                │
│     • 发送状态通知(如连接状态变化)    │
│     • 使用中断端点(Interrupt Endpoint)│
├─────────────────────────────────────────┤
│  2. 数据类接口 (DCI - Data Class        │
│     Interface)                          │
│     • 实际数据传输(收发数据)          │
│     • 使用批量端点(Bulk Endpoints)    │
│     • 一对 IN/OUT 端点用于双向通信      │
└─────────────────────────────────────────┘

为什么 CDC/ACM 很重要?

1. 操作系统原生支持

  • Windows:内置 usbser.sys 驱动,识别为 COMx 端口

  • Linux:内核自带 cdc_acm 驱动,创建 /dev/ttyACM0 等设备节点

  • macOS:原生支持,显示为 /dev/cu.usbmodem*/dev/tty.usbmodem*

  • Android:通过 UsbDeviceConnection 可以直接通信

2. 无需厂商专用驱动

与 FTDI、CH340、CP210x 等专用芯片不同,CDC/ACM 是标准协议

  • 插上即用(真正的免驱)

  • 跨平台兼容性好

  • 不需要安装额外的驱动程序


常见 CDC/ACM 设备

设备类型

例子

Arduino

Leonardo、Micro、Due、ESP32-S2/S3(原生 USB)

开发板

Raspberry Pi Pico、ESP32-C3/S3、STM32F4 系列

调试器

J-Link、DAPLink、ST-Link(部分型号)

模块

各种支持 USB 直连的 WiFi/蓝牙模块

手机

Android 手机的 USB 调试模式(ADB)


CDC/ACM vs 专用 USB 转串口芯片

特性

CDC/ACM

FTDI/CH340/CP210x

协议

USB 标准协议

厂商私有协议

驱动

系统自带,免驱

需要安装专用驱动

VID/PID

可用任意(但建议用标准类匹配)

固定厂商 VID(如 0x1A86 是沁恒)

实现位置

MCU 固件内实现

外部专用芯片

灵活性

高,可自定义功能

低,功能固定

成本

仅需 MCU(需带 USB 外设)

需额外芯片

兼容性

现代系统好,旧版 Windows 可能需要驱动

广泛兼容


在 usb-serial-for-android 中的体现

usb-serial-for-android 库中,CDC/ACM 是核心支持的驱动之一:

java

复制

// 库中的 CDC/ACM 驱动类
CdcAcmSerialDriver driver = new CdcAcmSerialDriver(device);

// 关键识别方式 - 通过 USB 接口描述符的类/子类
// Interface Class: 0x02 (Communications Device Class)
// Interface Subclass: 0x02 (Abstract Control Model)

识别 CDC/ACM 设备不需要 VID/PID 列表,因为可以通过标准接口类自动识别:

  • bInterfaceClass = 0x02 (CDC)

  • bInterfaceSubClass = 0x02 (ACM)

但有些非标准实现仍需 VID/PID 匹配。


总结

CDC/ACM = USB 官方标准的"虚拟串口"方案

  • 免驱:现代操作系统都内置支持

  • 标准:不绑定特定硬件厂商

  • 简单:应用层像操作普通串口一样读写

  • ⚠️ 注意:Windows 7 及更早版本可能需要手动安装驱动

如果你的设备是 Arduino LeonardoESP32-S3Raspberry Pi Pico 等带原生 USB 的板子,它们通常就是 CDC/ACM 设备,可以直接被识别为串口使用!