核心取舍看三点:实时性、资源占用、协议复杂度。裸串口分包(如帧头+长度+CRC)适合简单点对点、数据量小、MCU资源紧张(如8位机、RAM<2KB)的场景,实现快、调试直观;协议栈(如Modbus、CANopen、MQTT-SN)适合多节点组网、需重传/流控/加密或对接上位机生态,但代价是ROM/RAM开销(典型2-8KB)和中断延迟。实操建议:若单帧<64字节、波特率≤115200、无丢包容忍,裸分包足够——用状态机解析,避免阻塞式等待。若需断线重连、多主从或OTA,直接上协议栈,别自己造轮子。代码示例(裸分包状态机):
```c
uint8_t rx_state=0, len=0;
void uart_irq(uint8_t b){
switch(rx_state){
case 0: if(b==0xAA) rx_state=1; break;
case 1: len=b; rx_state=2; break;
case 2: buf[len++]=b; if(len>=frame_len) { /*校验*/ rx_state=0; }
}
}
```
最后:先画数据流图,若协议超过3种帧类型,建议上协议栈。
mcuku 阿沐 · 2026-08-19