本文章是基于原子的例程和开发板来解决的
想要直接看方法,请直接看
二、用到的软硬件和四、结论
一、前言
做毕设的时候想用NRF24L01实现电脑和单片机的通信,结果能实现电脑和电脑的通信、单片机和单片机之间的通信,唯独实现不了电脑和单片机之间的通信,最后经过半天的折腾解决了。
简单比喻就是,两个城镇,A镇和B镇的人想要互相写信,两个城镇的人语言是相同的,但是邮政系统对信封的格式不一样。A镇使用A格式,B镇使用B格式。当A镇人用A格式发给B镇,B镇邮政拿到信封看到格式不对,就当垃圾处理了。反过来同理。
二、用到的硬件和软件
注:这里用的是原子的例程,无线通讯实验
1.硬件
①原子STM32F103战舰版
②原子STM32F103最小系统板
③NRF24L01模块×2(淘宝链接,下同https://buyertrade.taobao.com/trade/itemlist/list_bought_items.htm?spm=a21bo.2017.1997525045.2.2b0811d9oY9Bqr)
④USB转SPI通信模块一个
2.软件
①Keil5
②Xcom
3.NRF24L01参数
①波特率:115200
②传输速率:2Mbps
③收发地址:0x34,0x43,0x10,0x10,0x01(原子例程中的地址)
④通信频率:2.440GHz
⑤CRC校验位:16位
三、测试过程
我先解决的是单片机发送给电脑端。
因为我之前弄过蓝牙的单片机和电脑端通信,知道串口助手只接收特定格式的数据,即数据的末尾两位数据帧必须是0x0d,0x0a。接着我翻了一圈原子的例程,没有发现末尾没有加格式帧,于是自己写了一串字符,加了数据帧,然后发送,上位机能收到了。
LCD_ShowString(30,150,200,16,16,"NRF24L01 TX_Modern");
NRF24L01_TX_Mode();
while(1)
{
if(NRF24L01_TxPacket(tmp_buf)==TX_OK)
{
LCD_ShowString(30,170,239,32,16,"Sended DATA:");
LCD_ShowString(0,190,lcddev.width-1,32,16,tmp_buf);
key=mode;
sprintf((char*)tmp_buf,"NRFL2401 is ok!rn");//把双引号内的东西以指定格式送到tmp_buf里去
//末尾加上格式帧0x0d,0x0a
tmp_buf[30]=0x0d;
tmp_buf[31]=0x0a;
}else
{
LCD_Fill(0,170,lcddev.width,170+16*3,WHITE);
LCD_ShowString(30,170,lcddev.width-1,32,16,"Send Failed"); //清空显示
};
LED0=!LED0;
delay_ms(150);
};
然后是电脑端发送给单片机端。
因为前车之鉴,我先用两块单片机做无线通信,把33帧数据帧全部显示出来看了看(伏笔),没发现什么格式的,然后再试了一次单片机和电脑通信,让单片机把传过来的数据逐帧显示,然后发现跟单片机之间互通之间的区别是,电脑发送的数据,第0帧记录了由几帧数据,第1帧之后的数据才是有用的。
然后我写了一个for循环调整把第0位剔除,这样单片机就能显示了
LCD_ShowString(30,150,200,16,16,"NRF24L01 RX_Mode");
LCD_ShowString(30,170,200,16,16,"Received DATA:");
NRF24L01_RX_Mode();
while(1)
{
if(NRF24L01_RxPacket(tmp_buf)==0)//收到则开始显示
{
tmp_buf[32]=0;//结束标志,测试了一下好像没啥关系
for(i=i;i<32;i++)//用for循环把tmp_buf的数据帧前移,剔除格式帧
{
tmp_buf
=tmp_buf[i+1];
}
LCD_ShowString(0,190,lcddev.width-1,32,16,tmp_buf);
}else delay_us(100);
t++;
if(t==10000)//大约1S
{
t=0;
LED0=!LED0;
}
};
四、结论
1、首先检查单片机和PC端两端的无线通信设置是否一致
2、单片机发送数据到单片机端:单片机发送数据的末尾两帧务必加上0x0d,0x0a
(另外观察到如果0x0d,0x0a在31和32帧,后面的数据会出现乱码,在30和31帧设置则不会)。
3、电脑端发送数据到单片机端:单片机处理收到的数据,要么直接取1~32位的数据,要么用循环,把第0位格式帧剔
经过以上步骤,就能用NRF24L01实现单片机和STM32的上下位机通讯了
本文章是基于原子的例程和开发板来解决的
想要直接看方法,请直接看
二、用到的软硬件和四、结论
一、前言
做毕设的时候想用NRF24L01实现电脑和单片机的通信,结果能实现电脑和电脑的通信、单片机和单片机之间的通信,唯独实现不了电脑和单片机之间的通信,最后经过半天的折腾解决了。
简单比喻就是,两个城镇,A镇和B镇的人想要互相写信,两个城镇的人语言是相同的,但是邮政系统对信封的格式不一样。A镇使用A格式,B镇使用B格式。当A镇人用A格式发给B镇,B镇邮政拿到信封看到格式不对,就当垃圾处理了。反过来同理。
二、用到的硬件和软件
注:这里用的是原子的例程,无线通讯实验
1.硬件
①原子STM32F103战舰版
②原子STM32F103最小系统板
③NRF24L01模块×2(淘宝链接,下同https://buyertrade.taobao.com/trade/itemlist/list_bought_items.htm?spm=a21bo.2017.1997525045.2.2b0811d9oY9Bqr)
④USB转SPI通信模块一个
2.软件
①Keil5
②Xcom
3.NRF24L01参数
①波特率:115200
②传输速率:2Mbps
③收发地址:0x34,0x43,0x10,0x10,0x01(原子例程中的地址)
④通信频率:2.440GHz
⑤CRC校验位:16位
三、测试过程
我先解决的是单片机发送给电脑端。
因为我之前弄过蓝牙的单片机和电脑端通信,知道串口助手只接收特定格式的数据,即数据的末尾两位数据帧必须是0x0d,0x0a。接着我翻了一圈原子的例程,没有发现末尾没有加格式帧,于是自己写了一串字符,加了数据帧,然后发送,上位机能收到了。
LCD_ShowString(30,150,200,16,16,"NRF24L01 TX_Modern");
NRF24L01_TX_Mode();
while(1)
{
if(NRF24L01_TxPacket(tmp_buf)==TX_OK)
{
LCD_ShowString(30,170,239,32,16,"Sended DATA:");
LCD_ShowString(0,190,lcddev.width-1,32,16,tmp_buf);
key=mode;
sprintf((char*)tmp_buf,"NRFL2401 is ok!rn");//把双引号内的东西以指定格式送到tmp_buf里去
//末尾加上格式帧0x0d,0x0a
tmp_buf[30]=0x0d;
tmp_buf[31]=0x0a;
}else
{
LCD_Fill(0,170,lcddev.width,170+16*3,WHITE);
LCD_ShowString(30,170,lcddev.width-1,32,16,"Send Failed"); //清空显示
};
LED0=!LED0;
delay_ms(150);
};
然后是电脑端发送给单片机端。
因为前车之鉴,我先用两块单片机做无线通信,把33帧数据帧全部显示出来看了看(伏笔),没发现什么格式的,然后再试了一次单片机和电脑通信,让单片机把传过来的数据逐帧显示,然后发现跟单片机之间互通之间的区别是,电脑发送的数据,第0帧记录了由几帧数据,第1帧之后的数据才是有用的。
然后我写了一个for循环调整把第0位剔除,这样单片机就能显示了
LCD_ShowString(30,150,200,16,16,"NRF24L01 RX_Mode");
LCD_ShowString(30,170,200,16,16,"Received DATA:");
NRF24L01_RX_Mode();
while(1)
{
if(NRF24L01_RxPacket(tmp_buf)==0)//收到则开始显示
{
tmp_buf[32]=0;//结束标志,测试了一下好像没啥关系
for(i=i;i<32;i++)//用for循环把tmp_buf的数据帧前移,剔除格式帧
{
tmp_buf
=tmp_buf[i+1];
}
LCD_ShowString(0,190,lcddev.width-1,32,16,tmp_buf);
}else delay_us(100);
t++;
if(t==10000)//大约1S
{
t=0;
LED0=!LED0;
}
};
四、结论
1、首先检查单片机和PC端两端的无线通信设置是否一致
2、单片机发送数据到单片机端:单片机发送数据的末尾两帧务必加上0x0d,0x0a
(另外观察到如果0x0d,0x0a在31和32帧,后面的数据会出现乱码,在30和31帧设置则不会)。
3、电脑端发送数据到单片机端:单片机处理收到的数据,要么直接取1~32位的数据,要么用循环,把第0位格式帧剔
经过以上步骤,就能用NRF24L01实现单片机和STM32的上下位机通讯了
举报