完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本文章是基于原子的例程和开发板来解决的
想要直接看方法,请直接看 二、用到的软硬件和四、结论 一、前言 做毕设的时候想用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的上下位机通讯了 |
|
|
|
只有小组成员才能发言,加入小组>>
2513 浏览 0 评论
1083浏览 2评论
700浏览 1评论
452浏览 0评论
193浏览 0评论
328浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 01:14 , Processed in 1.243739 second(s), Total 79, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号