[STM32]

单片机无线控制的一种方式,数据包打包和解包代码分享

[复制链接]
1298|1
手机看帖
扫描二维码
随时随地手机跟帖
XLazyDog|  楼主 | 2019-8-16 17:26 | 显示全部楼层 |阅读模式
1240.jpg
使用蓝牙调试器调试单片机

要实现无线控制,要解决的问题是 多个不同类型的变量如何通过串口传输。为了解决这个问题,我使用了一种数据包结构。
1.包头
2.原数据
3.校验
4.包尾
其中包头和包尾分别固定为 0xA5 和 0x5A,校验 为所有原数据字节之和的低8位。 在原数据中: 定义了五种不同的类型 bool、byte、short、int和float。五种类型的变量按照严格的顺序排列,其中
1.bool占1/8字节
2.byte占1字节
3.short占2字节
4.int占4字节
5.float占4字节
发送时:
发送方将要发送的数据按照顺序填入原数据,然后加上包头、校验和包尾,最终得到一串字节串,然后通过串口或其它方式发出。
接收时:
接收方建立一个较大的缓冲区,一直接收发来的字节,并且定时解析缓冲区中是否已有完整数据包,如果有完整数据包则将数据包中的数据按照顺序一一读出。

讲完原理,现在说一下如何实现。首先确定单片机和蓝牙串口模块的连接方式:
需要注意的是蓝牙串口模块与单片机之间的连接,其TX、RX与单片机TX、RX是交叉的。如果你使用STM32单片机的USART1的话,则 蓝牙的TX 连接 单片机的PA10口, 蓝牙的RX连接单片机的PA9口。
1240.jpg
连接方式

连接好蓝牙串口模块后,就开始写单片机程序了。由于我已经编写好了可以自由配置的单片机端的程序,所以你可以很方便地实现收发功能,代码在下方。
1.数据结构设置
下面是我编写好的名为valuepack的代码,其是在STM32F103单片机运行的,你也可以针对不同的平台进行修改,在使用此功能前,你首先需要在valuepack.h中配置通信结构。
1240.jpg
在valuepack.h中配置参数

1.1接收缓冲区尺寸
1240.jpg


缓冲区用来暂存从手机接收到的数据包,每次执行readValuePack时将这些暂存的数据包解析。缓冲区的尺寸默认为1024。
1.2发送数据包结构
1240.jpg


这里定义发送到手机的数据包的结构,即状态回传。在这里你可以像在蓝牙调试器上一样设置数据包中五种变量的数目。需要确保在此设置的五种类型变量的数目与手机的“接收数据包结构”的设置相同。否则手机端将无法解析该数据包。
1.3接收数据包结构
1240.jpg


这里定义从手机接收的数据包的结构,需要确保在此设置的五种类型变量的数目与手机的“发送数据包结构”的设置相同。
接下来就可以通过调用其函数实现数据收发了。
2.串口配置
1240.jpg
初始化串口

3.接收数据包3.1接收数据包结构体

创建接收数据包

首先创建一个接收数据包,该数据包中包含了五个数组,对应不同的数据类型。比如rxpack.bools[0]可以访问bool类型的第一个变量。
3.2读包
1240.jpg
解析数据包

在手机不断发送数据到单片机时,单片机需要定时执行readValuePack,并将接收数据包的地址传过去。读包的频率最好高于手机发送数据包的频率。
4.发送数据包4.1发送数据包结构体

创建发送数据包

创建一个发送数据包,该数据包中包含了五个数组,对应不同的数据类型。比如txpack.bools[0]可以访问bool类型的第一个变量。
4.2发包
1240.jpg
发送数据包

单片机定时执行sendValuePack函数,并传入要发送的数据包。sendValuePack函数执行频率不可过高,太高容易导致堵塞。
至此已经整个单片机端的数据收发就完成了。函数总共就三个 init、read和send,使用起来非常简单。
其实我也搞不懂我在说什么,如果你也看不懂的话,还是看我的代码吧。
STM32F103收发示例.zip (13.32 KB)

使用特权

评论回复

相关帖子

mjs0528| | 2019-10-6 21:17 | 显示全部楼层
谢谢分享,楼主辛苦!

使用特权

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

本版积分规则

6

主题

12

帖子

0

粉丝