嵌入式通用通信帧协议设计
嵌入式系统开发中,如串口UART、蓝牙、轻量级网络等通信链路往往需要自定义封包协议来保证数据传输的准确性。本文分享一套简洁、通用、易实现的帧协议设计方案,适配多类嵌入式通信场景。
一、帧协议结构(小端序)
协议采用 “帧头 + 标识 + 数据 + 校验 + 帧尾” 的经典结构,总长度灵活且解析逻辑简单,各字段定义如下:
字段字节数定义 / 取值核心作用帧头20xAA55(小端存储)帧同步标识,快速定位帧起始位置帧计数10~255(溢出归零)区分帧的新旧顺序,辅助检测丢包、重传帧 ID2自定义(如指令码 / 设备 ID)标识帧的功能类型(如读指令 / 写指令 / 响应包),适配多指令 / 多设备通信数据长度20~65535标识 “数据位” 的字节数,避免解析时内存溢出,限定数据区范围数据位不定业务自定义数据承载实际业务数据(如传感器值、控制指令参数)CRC16 校验2小端存储校验范围:帧计数~数据位,采用 CRC16-CCITT 多项式,检测传输过程中的字节错误帧尾20x55AA(小端存储)帧结束标识,辅助确认帧边界,降低字节流通信的帧解析错误率二、CRC16-CCITT的C代码
- /**
- * @brief CCITT CRC16算法
- * @param data :传入的数据指针
- * @param length : 数据长度
- * @retval crc计算结果
- */
- uint16_t crc16_CCITT(const uint8_t *data, uint32_t length)
- {
- uint16_t crc16_polynomial = 0x1021;
- uint16_t crc16_start_value = 0xFFFF;
- uint16_t crc = crc16_start_value;
-
- for (uint32_t i = 0; i < length; i++)
- {
- crc ^= (uint16_t)data[i] << 8;
- for (uint8_t bit = 0; bit < 8; bit++)
- {
- if (crc & 0x8000) crc = (crc << 1) ^ crc16_polynomial;
- else crc = crc << 1;
- }
- }
- return crc;
- }
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |