问题描述:
一、发射端
1、正确配置NRF模块,以及测试过能够正常通信,在发射端的发射线程中进行了如下操作
2、这里是获取了陀螺仪的x轴数据,将其而分为两个8位的数据存入发送缓冲区中。因为一个陀螺仪x轴数据是16位的,所以对其进行了拆分,这里只获取gyro的x轴数据进行发送,目的是进行测试。
3、这个是发送函数,只要把发送缓冲区的地址作为参数传入就可以发送了。
二、接收端
1、接收端的NRF24L01模块也正确配置后,在接收线程中进行如下操作
2、读取NRF传输过来的数据,存到接收BUF中,然后打印出来,查看
三、进行测试(发现问题)
1、此时发射端跟接收端都处于上电状态,接收端接了串口到电脑进行数据打印,发射端接了下载器进行代码修改下载
2、此时接收端打印的数据是正确的,我扰动飞机(也就是发送端),它的陀螺仪数据发生变化,而当我不动飞机,这两个数据最终会变为0,这是陀螺仪的gyro数据,所以目前是正常的。
3、接下来,我把飞机断电再重新上电,这时我扰动飞机,接收端接收到的数据始终为0,出现了问题,按理说我代码已经下进去了,我断电再重新上电应该依然能够接收到数据
问题解决:
1、将飞机(发送端)连接串口和下载器
2、点击下载程序,然后进行串口查看,发现mpu6050是能够成功初始化的
3、将飞机(发送端)进行断电再上电,发现串口打印输出mpu6050初始化失败,到这里已经明确为什么对发送端重新上电会导致接收端数据输出一直为0了,原来发送端重新上电后,mpu6050初始化失败了,罢工了。
4、为什么会初始化失败呢,来看一下我的mpu6050在哪初始化,我是在一个线程里对mpu6050进行初始化的,这其实是错误的写法,因为线程一旦开始调度,就有可能被更高优先级的线程打断,我的mpu6050初始化很有可能就是初始化到一半就被其他线程打断了,导致初始化失败。
5、把硬件初始化统一放在一个函数中,不要在线程里面对硬件初始化,然后在上电后,在各种线程开始调度前,首先对硬件进行初始化,还有最好在上电之后,各种硬件开始初始化之前,加上一个延时函数,给我们的硬件一点反映时间