【C】 USB CDC、Bulk-OUT 端点
在嵌入式固件开发中,CDC 通常指的是 USB CDC(Communications Device Class),是 USB 协议中的一个设备类。
🔧 什么是 USB CDC?
USB CDC 是一种 USB 设备类标准,用于模拟传统的串口通信(如 UART、RS-232)——也就是说,它允许嵌入式设备通过 USB 接口表现得像一个串口设备。
关键点:
- CDC = Communications Device Class
- 是 USB 协议中为“通信设备”定义的标准类
- 通常用于实现虚拟串口(Virtual COM Port)
在嵌入式固件中的应用
在 STM32、NXP、ESP32 等 MCU 的 USB 功能中,使用 USB CDC 类,可以让你的设备:
- 通过 USB 接口与主机通信
- 在主机上枚举成一个 COM 端口(比如 Windows 里显示为 COM4)
- 不再需要传统的串口硬件(TX/RX 引脚)
常见应用场景:
应用 | 描述 |
---|---|
USB 虚拟串口 | 嵌入式设备通过 USB 提供调试/日志输出 |
配置接口 | 用户通过 USB COM 端口配置设备参数 |
数据传输 | 通过 USB 串口传输数据,如 GPS 模块、传感器数据等 |
示例:STM32 上的 USB CDC
在 STM32CubeMX 中配置 USB:
- 将 USB 模式设置为 Device
- Class 选择为 Communication Device Class (Virtual Port Com)
- 生成代码后,你可以通过
USBD_CDC.c/h
来发送/接收数据 - 使用
CDC_Transmit_FS()
来发送数据给主机
与其他 USB 类的对比:
USB 类 | 功能 |
---|---|
CDC | 通信设备类(虚拟串口) |
HID | 人机接口设备(鼠标、键盘) |
MSC | 大容量存储(U盘) |
DFU | 固件升级(Device Firmware Upgrade) |
小结
项 | 内容 |
---|---|
名称 | USB CDC(Communications Device Class) |
用途 | 实现虚拟串口通信(USB ↔ 主机) |
应用 | 调试、配置、数据传输等 |
优点 | 无需传统串口,速度快,稳定性高 |
“Bulk-OUT 端点” 可以拆解成两部分来理解:
-
端点(Endpoint)
- 在 USB 设备上,每个接口(Interface)会定义若干个“端点”,就像“水管”的进出口,用于不同类型的数据传输。
- 每个端点都有一个编号(Endpoint Number),并分为 IN 或 OUT 两种方向。
-
OUT vs IN
- OUT 代表数据从 Host → 设备(Device)。
- IN 代表数据从 设备 → Host。
-
Bulk 传输类型
- USB 定义了几种传输类型:Control/Interrupt/Isochronous/Bulk。
- Bulk 传输适用于大块、对时延不敏感但需要保证可靠到达的数据,比如文件传输或串口模拟。
- 它在总线上尽可能多地抢占带宽,但如果总线空闲,Bulk 传输能获得全速。
所以,“那帧报文是由 USB 主机发到某个 Bulk-OUT 端点” 的意思就是:
- 主机(通常是你的 PC)通过 USB 连接,已经把设备识别(枚举)好了;
- 它选择了某个 编号为 X 的 Bulk-OUT 端点(例如端点地址
0x01
),把一段 大块数据(如你图中的5ZZZZZ…
)发送给设备; - 设备上负责这个端点的固件代码(
usbd_cdc_if.c
里CDC_Receive_HS
回调)就会被触发,把数据放到缓冲区,供上层程序处理。
总结一下:
Bulk-OUT 端点 = 一条“主机→设备”方向的大块数据通道——Host 通过它,把自己的报文(“55ZZZZZ …”)发给 MCU 上运行的 USB-CDC 固件。