STM32 虚拟串口固定发 64 字节,电脑端能正好收到 64 字节吗
结论:不能保证。CDC 是字节流,不是消息流,它不保证一次给你 64 字节,可能粘包,也可能分包。但它反过来也不会随机吞掉其中某几个字节。
三层各一句话:
- USB 总线:全速批量一包最大 64 字节,带 CRC 校验和重传。STM32 连续发的 64 字节,若出错也是整 64 字节一起丢,不会只少几个字节,因为坏包不会被部分交付。
- 驱动:CDC 把 USB 管道伪装成传统串口,传统串口没有包的概念,驱动把字节拼进内核缓冲区、抹平包边界,攒满一批或收短包(含 ZLP)才上抛,一次给多少由驱动决定,可能粘连也可能拆开。
- 应用:串口 API 语义是"返回当前已到的若干字节",没有"按包读"的接口,换驱动、加 HUB、过隔离器,行为都可能变。
所以:USB 不会随机吃掉某几个字节,除非你的软件自己没处理好;但 CDC 也不保证原样一次性给你 64 字节。指望它每次精确 64 字节是靠不住的,对齐只是现象,不是契约。