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 设备
CDC/ACM vs 专用 USB 转串口芯片
在 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 Leonardo、ESP32-S3、Raspberry Pi Pico 等带原生 USB 的板子,它们通常就是 CDC/ACM 设备,可以直接被识别为串口使用!
Android 串口通信(三)CDC/ACM 是什么?
https://lautung.com/archives/is3t7vw2