学习2种数据包格式
1·HEX数据包
2·文本数据包
目的:进行多字节的数据通信。
譬如:陀螺仪三维坐标XYZ,如果数据没有格式,分不清东西南北。
方法:把数据进行分割,成为一种格式,方便接收方进行识别。
还有高级的UT8编码法,有时间可以去学习。
串口数据包:通常添加 包头、包尾 。
举例:
第一种:固定包长,含包头包尾。
第二种:可变包长,含包头包尾。
HEX数据包
常见问题1:设置的包头、包尾,和数据载荷重复。
意思:要发送的数据,可能和包头、包尾是一样的,可能引起接收方误判。
解决措施:
1·限制载荷数据的范围,范围不包括包头、包尾即可。
2·使用固定长度的数据包,经过几个数据包,包头包尾都对齐了,剩下的数据包 ,应该就不会出现问题了。
3·增加包头包尾的数量,并且尽量呈现出载荷数据出现不了的状态
常见问题2:包头包围不是全部都需要的,可以只检到包头,x位之后,置标志位,一个数据包接受完成,这样载荷和包头的重复更加严重。
解决措施:如果包头包尾不重复,可选择可变包长,如果重复,优先选择固定包长。
常见问题3:各种数据转换为字节流的问题(6位/32位的整型数据、float、double、结构体)
解决措施:由于数据包都是由一个个字节组成,6位/32位、float、double、结构体是字节组成,
只需要用一个 uint8_t的指针 指向它,把它们当做一个字节数组发送。
( 指针的运用:[C语言] 指针的详解与应用-理论结合实践,真正理解指针!_哔哩哔哩_bilibili)
文本数据包
HEX数据包,是原始的字节数据呈现
文本数据包,则是经过一层编码和译码,最终表现出来文本格式
有大量的字符,可以作为包头包尾
可以有效避免包头包尾与载荷的重复问题
文本数据包,呈现的形式通俗易懂,一般在串口助手上面打印显示即可
所以通常,以 换行“\n” 作为包尾
一行一行的显示,非常方便
对比优缺
发送流程
HEX数据包
定义一个数组,填充数据
运用SendArray函数(之前写的),发送
文本数据包
定义一个字符串,填充数据
运用SendString函数(之前写的),发送
接收流程
举例:
1·固定包长HEX数据包的接收方法
2·可变包长HEX数据包的接收方法
固定包长HEX数据包的接收方法
根据之前的代码,每次收到一个字节,程序都会进入一遍中断
对于数据包,很明显具有前后关联性(包头,数据,包尾3种状态)
所以,在程序中,需要设计一个能记住不同状态的机制
设计思路:(简称 “状态机”)
不同状态下,执行不同的操作
状态的合理转移
步骤:
1·画状态转移图
3个状态:等待包头、接收数据、等到包尾
可变包长HEX数据包的接收方法
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_34525008/article/details/134296349
|