当前位置: 首页 > backend >正文

C语言接收数据、解析数据帧,解决丢包粘包问题

        如果在开发中碰到需要解析大量数据存在粘包现象的情况下:

        数据帧格式:0xAA(包头) + 0xXX(命令) + 0xXX(长度) + 数据部分 + 0xXX(CRC)

        下列函数可以从一串数据中提取一帧数据:

  • 提供帧同步能力(遇到中断帧或新帧头重新同步);

  • 高效接收并丢弃非法帧(溢出清空错误帧重起)。

#include <stdint.h>
#include <stdbool.h>
#include <string.h>#define MAX_FRAME_LENGTH 1024
#define FRAME_HEADER 0xAAuint8_t buffer[MAX_FRAME_LENGTH];
int bufferLen = 0;
bool foundStart = false;
int expectedLength = -1;void ProcessReceivedData(uint8_t* frame, int len);  // 处理数据帧函数,需你实现void ProcessIncomingBytes(uint8_t* data, int length)
{for (int i = 0; i < length; i++){uint8_t b = data[i];if (!foundStart){if (b == FRAME_HEADER){bufferLen = 0;buffer[bufferLen++] = b;foundStart = true;expectedLength = -1;}continue;}buffer[bufferLen++] = b;// 解析长度字段(第 3 个字节)if (bufferLen == 3 && expectedLength == -1){uint8_t dataLen = buffer[2];expectedLength = 1 + 1 + 1 + dataLen + 1;  // 帧头 + 命令 + 长度 + 数据 + CRC}// 如果再次遇到 0xAA,可能是新一帧开始if (b == FRAME_HEADER && bufferLen > 1){bufferLen--;  // 移除当前 0xAAif (expectedLength > 0 && bufferLen == expectedLength){ProcessReceivedData(buffer, bufferLen);}buffer[0] = FRAME_HEADER;bufferLen = 1;expectedLength = -1;continue;}// 收到完整帧if (expectedLength > 0 && bufferLen == expectedLength){ProcessReceivedData(buffer, bufferLen);bufferLen = 0;foundStart = false;expectedLength = -1;}// 错误保护:溢出处理if (bufferLen > MAX_FRAME_LENGTH){bufferLen = 0;foundStart = false;expectedLength = -1;}}
}

http://www.xdnf.cn/news/7920.html

相关文章:

  • 深入理解用于中断控制的 NVIC 寄存器
  • Python Day28 学习
  • 小白成长之路-Linux磁盘管理(二)
  • 香橙派3B学习笔记1:Putty串口_WIFI连接_SSH远程登录_网线连接
  • 精准识别记忆细胞!Elabscience PE Anti-Human/Mouse CD44 抗原特异性抗体
  • Proxmox 主机与虚拟机全部断网问题排查与解决记录
  • LabVIEW中EtherCAT从站拓扑离线创建及信息查询
  • Venom: 1靶场
  • 使用 Matter.js 创建封闭箱体与里面的小球
  • SOPHGO算能科技BM1688内存使用与编解码开发指南
  • 【Docker】Docker -p 将容器内部的端口映射到宿主机的端口
  • 5月24日全国青少年信息素养大赛——python编程挑战赛初赛就开赛了,你准备好没?
  • 计算机视觉与深度学习 | Python实现CEEMDAN-ABC-VMD-DBO-CNN-LSTM时间序列预测(完整源码和数据)
  • 第一章 Proteus中Arduino的可视化程序
  • Vue.js教学第九章:Vue动态与异步组件,高效开发全攻略
  • 什么是实时流数据?核心概念与应用场景解析
  • QRsim:一款快速验证控制算法和无缝迁移到实物平台的无人系统3D仿真平台
  • 虚拟机NAT模式获取不到ip
  • 全方位详解微服务架构中的Service Mesh(服务网格)
  • 深入浅出Java-Lambda表达式
  • 目标检测 LW-DETR(2024)详细解读
  • [Vue]路由基础使用和路径传参
  • 《C 语言字符串操作从入门到实战(上篇):字符分类、转换及strlen/strcpy等函数详解》
  • 智橙云PLM上线【企业知识库】,构建企业自己的研发创新知识库!!
  • 云DNS智能解析:实现多区域部署
  • 第五章 GPT模块配置
  • 深入浅出理解时间复杂度和空间复杂度
  • 【音频】如何解析mp3文件
  • 如何从 iPhone 获取照片:5 个有效解决方案
  • Wi-Fi(无线局域网技术)