用状态机的编程方式进行数据分割(入门级)

在对数据进行接收时,需要用到数据分割的情况,本文简单粗浅但又用易懂的方式讲讲

本文为本人在学习stm32串口收发数据时所理解(参考b站up:江协科技

在接收数据时,因为每次都是发送一个数据(单个字符),故此我们要储存在数组内,相当于c语言中的字符串。本人这么理解。

这里我们就要对数据进行一个处理,什么时候开始存储,什么时候停止存储等问题,将数据分割出来。

注:若本文有任何错误的地方,请大家多多指正,谢谢!!!!

目录

数据分割的类型

数据与包头包尾重复的问题:

处理数据:

示例:


数据分割的类型

  1. 把每个标志位置1来进行分割
  2. 额外添加包头包尾的方式,即 数据包==包头+数据+包尾

本文主要讲第2种,而这种又分为了固定包长可变包长两种,如下图:

 

这里我们将橙色的当成是包头,蓝色的是包尾,即开始位跟结束位,当判断到包头后,下一个数据就开始存储;当判断到包尾时就结束本次数据的储存。

数据与包头包尾重复的问题:

而这里就又出现了另一个问题:数据与包头包尾重复的情况

这里提供三种解决方法:

  1. 限制载荷数据的氛围,在分送时对数据进行限副
  2. 用固定长度,用包头包尾对齐数据,用于数据对齐
  3. 增加包头包尾的数量,或者使用为其他形式的数据避免与包头包尾重复

处理数据:

使用状态包进行数据接收流程:

用状态机的方法:定义为三个状态,用某个变量来表示,为0,1,2

S=0时进入这个步骤,判断是否为包头,是则s=1并退出中断;否则等待下一个数据进行判定 

S=1时每接受一个数据会进行对包尾的判断,若不是包尾则继续接受,若是包尾则回到初始位

注:下图为文本接收时的数据分割,"\r\n"合一起为回车键enter,将其作为包尾,对其进行两次包尾判断

示例:

下面这个示例截取至stm32收发数据的数据分割处理:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值