《嵌入式通讯协议栈实战》 3 通讯帧设计

第 3 篇:UART 协议设计------定义你自己的通讯协议


1. 帧格式设计

复制代码
┌──────┬──────┬──────┬──────┬──────┬──────┬──────┐
│ 帧头  │ 地址 │ 命令  │ 长度  │ 数据  │ CRC16 │ 帧尾  │
│ 2字节 │ 1字节│ 1字节 │ 1字节 │ N字节 │ 2字节 │ 1字节 │
│ 0xA5 │      │      │      │      │       │ 0x5A │
│ 0x5A │      │      │      │      │       │       │
└──────┴──────┴──────┴──────┴──────┴──────┴──────┘

2. 转义机制(SLIP 协议)

如果数据中恰好出现了 0xA5 或 0x5A,需要转义:

c 复制代码
#define FRAME_START  0xA5
#define FRAME_END    0x5A
#define ESCAPE_CHAR  0x7D

void slip_encode(uint8_t *in, int len, uint8_t *out, int *out_len) {
    for (int i = 0; i < len; i++) {
        if (in[i] == FRAME_START || in[i] == FRAME_END || in[i] == ESCAPE_CHAR) {
            out[(*out_len)++] = ESCAPE_CHAR;
        }
        out[(*out_len)++] = in[i];
    }
}

3. CRC16 校验

c 复制代码
uint16_t crc16_modbus(const uint8_t *data, int len) {
    uint16_t crc = 0xFFFF;
    for (int i = 0; i < len; i++) {
        crc ^= data[i];
        for (int j = 0; j < 8; j++) {
            if (crc & 1) crc = (crc >> 1) ^ 0xA001;
            else         crc >>= 1;
        }
    }
    return crc;
}

4. 逐字节解析状态机

c 复制代码
typedef enum { STATE_IDLE, STATE_HEAD1, STATE_HEAD2, STATE_ADDR,
               STATE_CMD, STATE_LEN, STATE_DATA, STATE_CRC1,
               STATE_CRC2, STATE_TAIL } proto_state_t;

void proto_parse_byte(proto_state_t *s, uint8_t byte) {
    switch (*s) {
        case STATE_IDLE:
            if (byte == 0xA5) *s = STATE_HEAD2; break;
        case STATE_HEAD2:
            *s = (byte == 0x5A) ? STATE_ADDR : STATE_IDLE; break;
        case STATE_ADDR:  frame.addr = byte; *s = STATE_CMD; break;
        // ... 依此类推
    }
}

状态机逐字节解析,不依赖于 DMA 缓冲区的起始位置------即使帧丢失也能自动恢复同步。


下一篇:I2C------主从模式的硬件与软件实现

相关推荐
ShineWinsu1 小时前
对于Redis:事务的解析
数据库·redis·mysql·缓存·面试·事务·acid
考研保研资料分享2 小时前
电子信息保研经验合辑:复旦直博与北邮集成电路,夏令营、预推免和专业面试
数学建模·面试·职场和发展·信息与通信
(Charon)3 小时前
【C++面试】堆内存与栈内存:string、vector和对象到底存在哪里
开发语言·c++·面试
lcj25113 小时前
【Linux】 Makefile 详解
linux·笔记·面试
(Charon)3 小时前
【C++面试】迭代器失效是什么?vector、list、map中如何避免迭代器失效
c++·算法·面试
怕浪猫3 小时前
面试官让我手写一个 Tool Use,我用了 3 种方案
设计模式·面试·程序员
EatFan4 小时前
2026 Java 后端面试风向变了:八股文只是门槛,场景化追问才是淘汰线
java·开发语言·jvm·面试·后端面试·八股文·full gc
考研保研资料分享5 小时前
自动化与机器人保研经验:四校夏令营笔面试、英语考核及复习规划(2025)
面试·机器人·自动化
2501_933670797 小时前
2027校招销售运营面试:大数据管理与应用专业如何拆解漏斗分析
大数据·人工智能·面试
丑陋小蚊子14 小时前
邮件投简历,正文和附件各写什么?
面试·求职招聘·大学生·简历·简历下载