使用蓝牙调试器调试单片机
要实现无线控制,要解决的问题是 多个不同类型的变量如何通过串口传输。为了解决这个问题,我使用了一种数据包结构。 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口。
连接方式
连接好蓝牙串口模块后,就开始写单片机程序了。由于我已经编写好了可以自由配置的单片机端的程序,所以你可以很方便地实现收发功能,代码在下方。 1.数据结构设置下面是我编写好的名为valuepack的代码,其是在STM32F103单片机运行的,你也可以针对不同的平台进行修改,在使用此功能前,你首先需要在valuepack.h中配置通信结构。
在valuepack.h中配置参数
1.1接收缓冲区尺寸
缓冲区用来暂存从手机接收到的数据包,每次执行readValuePack时将这些暂存的数据包解析。缓冲区的尺寸默认为1024。 1.2发送数据包结构
这里定义发送到手机的数据包的结构,即状态回传。在这里你可以像在蓝牙调试器上一样设置数据包中五种变量的数目。需要确保在此设置的五种类型变量的数目与手机的“接收数据包结构”的设置相同。否则手机端将无法解析该数据包。 1.3接收数据包结构
这里定义从手机接收的数据包的结构,需要确保在此设置的五种类型变量的数目与手机的“发送数据包结构”的设置相同。 接下来就可以通过调用其函数实现数据收发了。 2.串口配置
初始化串口
3.接收数据包3.1接收数据包结构体
创建接收数据包
首先创建一个接收数据包,该数据包中包含了五个数组,对应不同的数据类型。比如rxpack.bools[0]可以访问bool类型的第一个变量。 3.2读包
解析数据包
在手机不断发送数据到单片机时,单片机需要定时执行readValuePack,并将接收数据包的地址传过去。读包的频率最好高于手机发送数据包的频率。 4.发送数据包4.1发送数据包结构体
创建发送数据包
创建一个发送数据包,该数据包中包含了五个数组,对应不同的数据类型。比如txpack.bools[0]可以访问bool类型的第一个变量。 4.2发包
发送数据包
单片机定时执行sendValuePack函数,并传入要发送的数据包。sendValuePack函数执行频率不可过高,太高容易导致堵塞。 至此已经整个单片机端的数据收发就完成了。函数总共就三个 init、read和send,使用起来非常简单。 其实我也搞不懂我在说什么,如果你也看不懂的话,还是看我的代码吧。
|