STM32F103与电脑端通信(使用NRF24L01)


本文章由妖怪之山荷城科技协会提供技术支持
在这里插入图片描述

本文章是基于原子的例程和开发板来解决的
想要直接看方法,请直接看二、用到的软硬件四、结论


一、前言

做毕设的时候想用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_Mode\r\n");	
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!\r\n");//把双引号内的东西以指定格式送到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[i]=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的上下位机通讯了

在这里插入图片描述

  • 10
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值