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

第31讲 循环缓冲区与命令解析

      串口在持续接收数据时容易发生数据黏包(先接收的数据尚未被处理,后面的数据已经将内存覆盖)的情况,循环缓冲区的本质就是将串口接受到的数据马上拷贝到另外一块内存之中。为了避免新来的数据覆盖掉尚未处理的数据,一方面缓冲区的长度需要有一定的冗余,另外一方面需要引入写索引(写指针)始终指向未写数据区域的开头。

      当一包数据发生溢出的时候,也可以被切割为两部分,一部分写在缓冲区最后,另外一部分写在缓冲区开头。

        与此同时,为了防止写入buffer的新数据把尚未处理的旧数据覆盖掉,我们还需要引入读索引的机制,让其指向正在解析的数据的开头。CPU解析完成一帧数据之后再让readIndex指向下一帧需要解析的数据。

       综上,当新数据到来之时,我们就需要判断writeIndex和readIndex之间的空闲区域是否能装下新的数据,如果装不下,就只能抛弃这一帧数据。出现这种情况后,我们就需要调整这三个参数:(增大)缓冲区大小、(减慢)发送方发送速度、(加快)数据处理速度。

循环缓冲区算法示意图:

      注意,readIndex(读指针)除了防止未处理的数据被覆盖之外,还可以用来寻找完整的数据包,用来破解拆包、粘包以及坏包问题。

      假定数据帧通过以下数据格式发送,包头为0xAA代表一帧数据包的开始,随后是一字节的数据包长度,然后是一定长度的数据,最后一位则是校验和(计算方式是将前面所有位相加取最后一字节数据)。

IOC文件准备:

①开启调试接口与外部时钟晶振,设置时钟主频为72Mhz。

 ②使能串口2的全局中断。

③在Core和Src文件目录下分别新建command.c与command.h文件

    

http://www.lryc.cn/news/2380161.html

相关文章:

  • mapbox-gl强制请求需要accessToken的问题
  • 数据结构(十)——排序
  • 美蛋工具箱:一站式解决图片、视频、音频和文档处理需求的聚合神器
  • fastadmin 数据导出,设置excel行高和限制图片大小
  • python打卡day16
  • Redis 学习笔记 5:分布式锁
  • 游戏开发实战(一):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】
  • VS2017编译librdkafka 2.1.0
  • 02- 浏览器运行原理
  • Reactor模型详解与C++实现
  • 人工智能重塑医疗健康:从辅助诊断到个性化治疗的全方位变革
  • 移除链表元素数据结构oj题(力扣题206)
  • 学习记录:DAY29
  • OpenTelemetry 从入门到精通
  • 数学复习笔记 17
  • C语言:在操作系统中,链表有什么应用?
  • 解锁MySQL性能调优:高级SQL技巧实战指南
  • 裸金属服务器和云服务器之间的差别
  • WebSocket实时双向通信:从基础到实战
  • 【免杀】C2免杀技术(六)进程镂空(傀儡进程)
  • ETL数据集成产品选型需要关注哪些方面?
  • Eclipse Java 开发调优:如何让 Eclipse 运行更快?
  • 彻底理解事件循环(Event Loop):从单线程到异步世界的桥梁
  • java加强 -stream流
  • Vue百日学习计划Day33-35天详细计划-Gemini版
  • Linux(2)——shell原理及Linux中的权限
  • 如何在线免费压缩PDF文档?
  • EasyExcel动态表头
  • 汽车装配又又又升级,ethernetip转profinet进阶跃迁指南
  • css:无限滚动波浪线