在对数据进行接收时,需要用到数据分割的情况,本文简单粗浅但又用易懂的方式讲讲
本文为本人在学习stm32串口收发数据时所理解(参考b站up:江协科技)
在接收数据时,因为每次都是发送一个数据(单个字符),故此我们要储存在数组内,相当于c语言中的字符串。本人这么理解。
这里我们就要对数据进行一个处理,什么时候开始存储,什么时候停止存储等问题,将数据分割出来。
注:若本文有任何错误的地方,请大家多多指正,谢谢!!!!
目录
数据分割的类型
- 把每个标志位置1来进行分割
- 额外添加包头包尾的方式,即 数据包==包头+数据+包尾
本文主要讲第2种,而这种又分为了固定包长和可变包长两种,如下图:
这里我们将橙色的当成是包头,蓝色的是包尾,即开始位跟结束位,当判断到包头后,下一个数据就开始存储;当判断到包尾时就结束本次数据的储存。
数据与包头包尾重复的问题:
而这里就又出现了另一个问题:数据与包头包尾重复的情况
这里提供三种解决方法:
- 限制载荷数据的氛围,在分送时对数据进行限副
- 用固定长度,用包头包尾对齐数据,用于数据对齐
- 增加包头包尾的数量,或者使用为其他形式的数据避免与包头包尾重复
处理数据:
使用状态包进行数据接收流程:
用状态机的方法:定义为三个状态,用某个变量来表示,为0,1,2
S=0时进入这个步骤,判断是否为包头,是则s=1并退出中断;否则等待下一个数据进行判定
S=1时每接受一个数据会进行对包尾的判断,若不是包尾则继续接受,若是包尾则回到初始位
注:下图为文本接收时的数据分割,"\r\n"合一起为回车键enter,将其作为包尾,对其进行两次包尾判断
示例:
下面这个示例截取至stm32收发数据的数据分割处理: