备赛电赛学习STM32(十二):USART串口进阶

一、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、包头包尾和数据载荷重复的问题

对于数据和包头包尾重复可能引起误判,有以下几种解决方法:

  1. 限制载荷数据的范围。如果可以,我们可以限制数据的范围,使发送数据的最大可能值达不到包头包尾的数值。
  2. 使用固定长度的数据包。这样我们只要通过包头包尾对齐了数据,我们就可以清楚的知道哪个数据是包头包尾,哪个数据是载荷数据。
  3. 增加包头包尾的数量,并且让它呈现出载荷数据出现不了状态。比如我们使用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
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘子ゆ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值