给 USB CDC 设计一套应用协议

给 USB CDC 设计一套应用协议

本文字数:363  阅读时长:1分钟

访客数:加载中... | 阅读量:加载中...

USB CDC 本质是一条字节流,没有消息边界。想在上面跑自己的命令,第一步是分帧:用 0x00 当分隔符,配合 COBS 把正文里的 0x00 全部消掉,这样任意位置开始读都能重新对齐。

8 字节头

text
ver | type | seq(u16) | cmd | status | body_len(u16) | body | crc16

seq 由主机分配,响应原样带回,用来把异步事件和响应分开;crc16 覆盖头+正文,坏帧直接丢。正文用 TLV(tag/len/value),未知 tag 跳过,这样加字段不会破坏旧上位机。

为什么不用 JSON

MCU 上解析 JSON 要堆分配、要处理转义,还要额外一帧的长度字段来解决分帧。二进制协议解析是几十行 C,且帧长可预测。代价是调试不直观——所以再配一个 Python 端编码器,逐字节对齐测试向量。

踩过的坑

  • uart_tx() 在没开异步 API 时返回 -ENOTSUP,CDC ACM 也没有 .tx,只能用逐字节 uart_poll_out。
  • 状态变化事件要在驱动层发布,不能只靠命令处理器,否则从 shell 改 LED 就不会产生事件。