首先进行实验,对于代码在上一节的基础上,先定义新变量以及增加一个发送数据包函数:
本代码设置FF为包头,FE为包尾,中间为需要传输的数据,一次为4个,之后是接收数据包的函数
当标志位为1代表接收到数据,同时在H文件中申明以下变量(在main函数中调用)
之后修改中断函数,分为三种情况,当接收数据为FF时,表明接收到包头,之后需要开始传输数据。当为1时,表示开始接受数据组,本文设置为4个数据,因此当数据≥4时表明一个数据包传输完毕,之后RX状态为2发送包尾FE,表明一个数据包完整发送完毕。
本节的发送接收增加按键功能,按下一次原始数据+1并显示发送显示在OLED的TXRata上,接收时通过串口助手发送数据并显示结果在OLED上
结果如下:
1、发送数据包时的现象:
USART串口发送
2、串口发送STM32接收的情况
第二个是发送文本信息,与上边的类似,需要将包头改为@,包尾为/r/n(换行)
删除上面的两个函数,将中断函数修改为如下,只有RxFlag为0时才会执行读数据的操作,防止数据包的错乱:
主函数为:
使用strcmp将输入数据与指定的两个对比,如果一致执行指定命令,反之输出错误指令但仍然输出发送的文本。
实验结果如下:
首先在串口发送区输入灯亮指令:
之后是灯灭指令:
然后是其他输入:
理论知识如下:
首先对于HEX数据的传输主要有以下两种方式:
为防止包头包尾与传输的数据出现重复,主要有以下方法解决:
1、限制载荷的取值范围(防止传输的数据与包头包尾一致)
2、尽量选用固定包长
3、可选用多种包头包尾,如包头为FF\FD,包尾为FE\FC等方式
优点:适合发送原始数据,如陀螺仪数据、温湿度数据等
缺点:容易出现包头包尾与数据重复现象
之后是接收部分:
文本数据包就是在HEX的基础上加了一个编码实现
优点:指令比较直观,适合人机交互场景,蓝牙传输等
缺点:解析比较麻烦
文本的数据包接收状态机:
以上比较直观了解到数据包的发送与接收的理论内容。