NRF24L01模块多发一收通信(STM32)

NRF24L01模块多发一收通信(STM32)

前言

当笔者用STM32F103C8T6调出NRF24L01模块一对一通信后,突然心血来潮想调多对一通信,网上查了一圈资料发现NRF24L01无线模块多对一通信要用其他的通道,而一个NRF24L01模块的通道也就只有6个通道,也就是说,最多只能支持六对一通信,而且设置多对一通信时又要修改工程函数的好多地方,比较麻烦。笔者在学长的指导下,想出了解决的方法,免去了比较麻烦的操作,本文将详细介绍这种解决方法。

一、解决思路

一个设备一个ID编号,每个发送设备有自己独一无二的编号,我只需把ID编号和要发送的数据一起打包发送到接收设备,接收设备再将每接收到的一包数据拆解,通过识别出ID号就可以知道是哪个设备发送的数据了。理论上来说,可以扩展到6个以上NRF24L01模块通信。

二、实验过程

1.设备ID号定义

在发送设备的主函数中宏定义一个数字编号。
代码如下(示例):

#define		ID		1			//一个NRF一个ID号

2.数据打包发送

用sprintf函数将多组数据打包到一个数组中再发送,将ID号放在首位,方便接收端判断。
代码如下(示例):

*函数功能:数据打包发送
*输    入:str 要发送的字符串
*/
void NRF_Send(u8 str[])
{
	char buffer[32];
	sprintf(buffer, "%d%s", ID, (char *)str);			//将多种数据打包到一个数组中
//	printf("%s\n", buffer);				//测试用,请忽略
	NRF24L01_TxPacket((u8 *)buffer, strlen(buffer));		//开始发送数据,参数为要发送的数组内容和数组的长度
}

3.数据接收拆解

先定义两个数据存储数组。

char buff[32];		//分离出设备ID号后的数据存储数组
u8 rx_buff[32];			//接收到的数据存储数组,首位为ID号

然后对接收到的一包数据进行拆解,先对每包数据的首位数据进行判断,再分离数据,分离数据用到strncpy这个函数。

/*
*函数功能:数据接收
*
*/
void NRF_Receiv()
{
	NRF24L01_RxPacket( rx_buff );		//接收字节
	switch(rx_buff[0])			//判断设备ID,并将ID号和数据分离出来
	{
		case '1': printf("ID=%c\n", rx_buff[0] );strncpy(buff, rx_buff+1, strlen(rx_buff)-1);printf("DATA=%s\n", buff);break;
		case '2': printf("ID=%c\n", rx_buff[0] );strncpy(buff, rx_buff+1, strlen(rx_buff)-1);printf("DATA=%s\n", buff);break;
		default: break;
	}
}

总结

本次实验使用的是一对一通信的发、接地址,即发送设备都是用同一个发送地址。在实验过程中发现,如果每个设备发送的数据长度不一样就会吞数据,数据长度一样就不会出现这种情况,可能是接收数据的存储数组没搞好,应该多定义对应的数组存储对应的设备的数据。这种方法理论上可以扩展到很多设备对一通信,笔者做的是二对一通信实验,通过改变ID号,效果也是还不错的。总的来说,这样操作免去了重新编写NRF模块函数的步骤,还是比较方便的。如果大家想调一对一通信的话可以参考这篇博文:STM32无线通信——nRF24L01通信模块

写得还是比较详细的,笔者是在此基础上做的实验。


版权声明:本文为Gxust_Veneno原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。