单片机交流
直播中

张艳

7年用户 1590经验值
私信 关注
[问答]

如何用NRF24L01实现电脑和单片机的通信?

如何用NRF24L01实现电脑和单片机通信

回帖(1)

韩俊

2021-11-8 10:45:46
本文章是基于原子的例程和开发板来解决的
想要直接看方法,请直接看
二、用到的软硬件四、结论
  一、前言

做毕设的时候想用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的上下位机通讯了


举报

更多回帖

×
20
完善资料,
赚取积分