一、USART串口数据包
1.1、两种类型的数据包
1.1.1、HEX数据包
- 数据包的作用:把一个个单独的数据打包起来,方便我们进行多字节的数据通信
- 分割和打包的方法,可以自己设计,比如在XYZXYZ的数据流中,数据包的第一个数据,也就是X的数据包,它的最高位置1,其余数据包最高位置0,当我接收到数据时判断一下最高位,如果是1,那就是X数据然后紧跟的是Y和Z(这种方法不推荐,因为破坏了原有数据,使用起来比较复杂)
- 串口数据包一般是额外添加包头和包尾,例如上图中的固定包长含包头包尾以及可变包长含包头包尾,数据包的结构可以自己规定也可以是买到的模块的卖家规定的
1.1.2、文本数据包
- 文本数据包和HEX数据包分别对应了文本模式和HEX两种模式
- 在HEX数据包里面,数据都是以原始字节数据本身呈现的,而在文本数据包里面,每个字节都经过一层编码和译码
- 同样有固定包长和可变包长两种形式,通常以换行作为包尾
1.1.3、HEX数据包和文本数据包对比
- HEX数据包优点:传输直接,解析数据简单,比较适合一些模块发送原始的数据,比如使用串口通信的陀螺仪、温湿度传感器,
- HEX数据包缺点:灵活性不足,载荷和包头包尾容易重复
- 文本数据包优点:数据直观易理解,非常灵活,比较适合一些输入指令进行人机交互的场合
- 文本数据包缺点:解析效率低
1.2、数据包的相关问题
1.2.1、包头包尾和数据载荷重复的问题
对于数据和包头包尾重复可能引起误判,有以下几种解决方法:
- 限制载荷数据的范围。如果可以,我们可以限制数据的范围,使发送数据的最大可能值达不到包头包尾的数值。
- 使用固定长度的数据包。这样我们只要通过包头包尾对齐了数据,我们就可以清楚的知道哪个数据是包头包尾,哪个数据是载荷数据。
- 增加包头包尾的数量,并且让它呈现出载荷数据出现不了状态。比如我们使用FF、FE作为包头,FD、FC作为包尾
1.2.2、包头包尾是否需要的问题
并不是所有情况我们都需要包头和包尾,比如我们可以只要一个包头,把包尾删掉,这样数据格式就是一个包头+4个数据,当监测到FF开始接收,收够4个字节置标志位,一个数据包接收完成(这样,载荷和宝投诉重复的问题会严重一些)
1.2.3、固定包长和可变包长的选择问题
对于HEX数据包来说,如果你的载荷会出现和包头包尾重复的情况,那就最好选择固定包长,这样可以避免接受错误。
如果载荷和包头包尾不会重复,那选可变包长
1.2.4、各种数据转换为字节流的问题
这里数据包都是一个字节一个字节组成的,如果你想发送16位的整型数据、32位的整型数据、float、double、甚至是结构体,其实都没问题,因为它们内部其实都是由一个字节一个字节组成的,只需要用一个uint8_t的指针指向它,把它们当成一个字节数组发送就行了
1.3、数据包的接收流程
1.3.1、HEX接收
1.3.2、文本接收
二、实例部分
2.1、串口收发HEX数据包
2.1.1、接线图
2.1.2、代码部分
- serial.h
#ifndef __SERIAL_H
#de