CDC(Communication Device Class)是什么?
CDC(Communication Device Class)是什么?
核心定义
CDC 的全称是 Communication Device Class,即通信设备类。它是 USB 协议规范中定义的一个设备类。
简单来说,CDC是一个标准规范,它允许USB设备(如调制解调器、网络适配器、串口转换器等)在连接到电脑(主机)时,被识别为一个通信设备,而无需安装特定的、由设备制造商提供的驱动程序。
核心目标与解决的问题
在USB标准出现之前,计算机与调制解调器、打印机等设备通常通过串行端口(COM口) 或并行端口连接。这些接口简单,但速度慢,且需要独立的硬件接口。
USB的出现旨在统一外部设备的连接方式。CDC的目标就是在USB的架构上,模拟传统的通信方式(尤其是串行通信),从而实现:
- 驱动程序标准化:操作系统(如Windows, Linux, macOS)可以内置一个通用的CDC驱动程序。任何符合CDC规范的设备插入电脑后,都能被立即识别并使用,实现“即插即用”。
- 简化开发:设备制造商无需为不同操作系统编写和维护复杂的驱动程序,只需确保其设备固件符合CDC规范即可。
- 取代传统串口:在现代电脑(尤其是轻薄笔记本)普遍取消传统DB9串口的情况下,USB转串口线(USB to TTL/RS232)成为了主流,而这些线缆的内部芯片大多实现了CDC协议。
工作原理
CDC定义了一套标准的描述符 和通信接口。
当一个CDC设备插入USB主机时,它会向主机报告自己的身份:
- 设备描述符:告诉主机“我是一个USB设备”。
- 配置描述符和接口描述符:这是关键。CDC设备通常会包含一个或多个接口:
- 通信类接口(CCI):用于管理通信。主机通过这个接口发送控制命令,例如设置波特率、数据位、停止位、流控等(就像在传统串口上一样)。
- 数据接口:用于传输实际的数据。数据以批量传输或等时传输的方式在这个接口上流动。
主机操作系统识别到这些标准的CDC描述符后,就会加载其内置的 usbser.sys(Windows)或 cdc_acm(Linux)等通用驱动程序。随后,在操作系统中会创建一个虚拟的COM端口(在Windows上)或 /dev/ttyACMx / /dev/ttyUSBx(在Linux上)。
应用程序(如串口调试助手、终端程序)就可以像操作一个物理COM口一样,通过打开这个虚拟COM口来与USB设备进行通信。
常见应用场景
CDC的应用非常广泛,以下是一些典型的例子:
- USB转串口适配器:这是最常见的应用。一个小芯片(如FTDI, CP2102, CH340,以及很多STM32微控制器自带的USB功能)实现CDC协议,将USB数据包转换为UART信号,用于连接单片机、路由器、工业控制器等。
- 蜂窝调制解调器(4G/5G上网卡):很多USB上网卡使用CDC来建立一个虚拟串口,用于发送AT命令(如拨号、查询信号强度)和管理连接,同时使用另一个接口进行高速数据传输。
- 以太网适配器:USB有线网卡或Wi-Fi网卡有时会使用一个叫做“ECM”的CDC子类。
- 嵌入式系统调试与通信:许多开发板(如Arduino, ESP32, STM32)利用其MCU的USB功能,将自己模拟成一个CDC设备,方便开发者通过串口进行程序调试、日志输出和固件上传。
CDC的子类
CDC是一个大类,其下包含多个子类,以适应不同类型的通信设备:
- ACM(Abstract Control Model):最常用的子类,用于模拟串行端口。我们平时提到的“USB CDC”通常就是指CDC ACM。
- ECM(Ethernet Networking Control Model):用于模拟以太网适配器。
- NCM(Network Control Model):ECM的增强版,效率更高,是现代USB网卡的首选。
- PSTN:用于模拟传统电话调制解调器。
- …等等
总结
| 特性 | 描述 |
|---|---|
| 全称 | Communication Device Class |
| 所属体系 | USB |
| 核心目的 | 标准化通信设备(尤其是串口)在USB总线上的行为 |
| 主要优势 | 免驱(使用操作系统内置通用驱动),简化开发 |
| 工作表现 | 在操作系统中创建一个虚拟COM口 |
| 常见应用 | USB转串口线、4G/5G上网卡、嵌入式设备调试接口 |
| 最重要子类 | CDC ACM |
总而言之,CDC是USB生态中一个非常重要且成功的设备类,它无缝地桥接了现代的USB总线与传统的串行通信概念,极大地促进了各种设备与计算机的互联。
