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版权协议,转载请附上原文出处链接和本声明。