打印
[应用相关]

N32G003学习之串口数据包

[复制链接]
463|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
drer|  楼主 | 2024-2-6 08:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
学习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

使用特权

评论回复
沙发
tpgf| | 2024-3-5 10:01 | 只看该作者
一般一个串口的数据包的数据最多能达到多少呢

使用特权

评论回复
板凳
wakayi| | 2024-3-5 11:06 | 只看该作者
16进制数据包和文本数据包存在对应的关系吗

使用特权

评论回复
地板
wowu| | 2024-3-5 22:20 | 只看该作者
每收到一个字节都要进入一次中断的话 对缓存的压力比较大啊

使用特权

评论回复
5
renzheshengui| | 2024-3-5 22:53 | 只看该作者
这些数据包的格式是厂商规定好的还是说用户可以自行定义啊

使用特权

评论回复
6
paotangsan| | 2024-3-5 23:26 | 只看该作者
定义的字符串的长度收到什么的限制呢

使用特权

评论回复
7
keaibukelian| | 2024-3-5 23:59 | 只看该作者
在串口接收的时候,单片机会自行判定是否接收完成了吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

3309

帖子

4

粉丝