USB CDC 本质是一条字节流,没有消息边界。想在上面跑自己的命令,第一步是分帧:用 0x00 当分隔符,配合 COBS 把正文里的 0x00 全部消掉,这样任意位置开始读都能重新对齐。
8 字节头
text
ver | type | seq(u16) | cmd | status | body_len(u16) | body | crc16seq 由主机分配,响应原样带回,用来把异步事件和响应分开;crc16 覆盖头+正文,坏帧直接丢。正文用 TLV(tag/len/value),未知 tag 跳过,这样加字段不会破坏旧上位机。
为什么不用 JSON
MCU 上解析 JSON 要堆分配、要处理转义,还要额外一帧的长度字段来解决分帧。二进制协议解析是几十行 C,且帧长可预测。代价是调试不直观——所以再配一个 Python 端编码器,逐字节对齐测试向量。
踩过的坑
uart_tx()在没开异步 API 时返回-ENOTSUP,CDC ACM 也没有.tx,只能用逐字节uart_poll_out。- 状态变化事件要在驱动层发布,不能只靠命令处理器,否则从 shell 改 LED 就不会产生事件。
- 本文链接: https://graveblog.cn/p/usb-proto/
- 版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。
