求帮助。。Arduino 使用nRF24L01模块发送char型数组的问题

博主尝试使用2.4G无线模块进行不同格式数据的发送与接收,遇到的主要问题是数据长度的确定与数据类型转换,尤其是在发送char类型数组时,如何正确地转化为byte类型并确保长度一致。
有几组数据分别是不同长度,eg:Fxxx;
Fx.xxx;
Dx:xxx;
x:代表的是数字
现在想通过这个2.4G模块将这个数组发送出去,接收端接收后将数据通过串口打印出来

经过几天的查帖没有发现有用这个模块发送字符串的例子。。就很苦恼

---------------------------------------------发送端代码--------------------------------------------
 

[C] 纯文本查看 复制代码

?

代码

001

002

003

004

005

006

007

008

009

010

011

012

013

014

015

016

char txData[9];  //接收串口读入数据的数组

 

void setup()

{

  Serial.begin(9600);

  Mirf.cePin = 8;

  Mirf.csnPin = 7;

  Mirf.spi = &MirfHardwareSpi;

  Mirf.init();

   

  Mirf.setRADDR((byte *)"ABCDE"); //设置自己的地址(发送端地址),使用5个字符  

  Mirf.payload = 48;  //疑问: 如果要发送的话这里应该是byte类型数组的长度还是char数组类型的长度。。?

  Mirf.channel = 90;              //设置所用信道(自动寻道匹配)

  Mirf.config();

  Serial.println("InitReady");

}



 

[C] 纯文本查看 复制代码

?

代码

001

002

003

004

005

006

007

008

009

010

011

012

013

014

015

016

017

void loop()

{

  Mirf.setTADDR((byte *)"FGHIJ");           //设置接收端地址

  if(Serial.available() > 0)

  {

    /*这里是数据处理的部分, 得到的数组txd[9] 就是对应本帖开头的三种数据格式*/

    //这里输出的比如是F1.23

   }

 

      Serial.print(txd);

//Serial.println(strlen((byte)txd)); //这个打印出来的大小是45 - 47左右的数值

 

Mirf.send((byte *) txd);  //不知道这样写对不对

    }

  }

  char txData[9] = {};   //数组清空

  while(Mirf.isSending()) delay(1);         //直到发送成功,退出循环

  delay(1500);

}

  


---------------------------------------------发送端结束--------------------------------------------

---------------------------------------------接收端代码--------------------------------------------
代码

001

002

003

004

005

006

007

008

009

010

011

012

013

014

015

016

017

018

019

020

021

022

023

024

025

026

027

028

029

030

031

char rxData[9];

 

void setup()

{

  Serial.begin(9600);

  Mirf.cePin = 8;

  Mirf.csnPin = 7;

  Mirf.spi = &MirfHardwareSpi;

  Mirf.init();

  

  Mirf.setRADDR((byte *)"FGHIJ"); //设置自己的地址(接收端地址),使用5个字符

  Mirf.payload = 48; //同上的问题

  Mirf.channel = 90;   //设置使用的信道

  Mirf.config();

  Serial.println("Listening...");  //开始监听接收到的数据

}

 

void loop()

{

  if(Mirf.dataReady())

  //当接收到程序,便从串口输出接收到的数据

    Mirf.getData((byte *) rxData);

    Serial.print("Got data: ");

    Serial.println(rxData);

  }

  char rxData[9] = {};

  delay(1500);

}

---------------------------------------------接收端结束--------------------------------------------

这个最后的结果见图
小白求助。。这个Mirf.send()函数发送数组的时候应该怎么做,网上查的是要转型为byte类型的数组,一位一位的发送,但是转完型之后的数组长度为什么会大很多导
致在发送的时候数组的长度不知道怎么确定。经过查询Arduino里面的byte和char只是符号和范围的区别。。因此现在很乱。。请社区里的各位大佬赐教!!
如果有发送char数组的例程就更好啦,谢谢各位啦
 

 

串口结果,左边是接收端,右边是发送端

串口结果,左边是接收端,右边是发送端

### 使用 Arduino UNO 和 NRF24L01 模块配合电容式土壤湿度传感器实现数据接收 在使用 Arduino UNO 和 NRF24L01 模块与电容式土壤湿度传感器进行通信时,需要确保发送端和接收端的配置一致。以下是一个完整的实现方案,包括代码示例和相关说明。 #### 硬件连接 - **发送端**(连接电容式土壤湿度传感器): - 将电容式土壤湿度传感器的信号输出引脚连接到 Arduino 的模拟输入引脚(如 A0)。 - NRF24L01 模块连接到 Arduino UNO,具体连接方式参考模块的 GPIO 引脚定义。 - **接收端**(Arduino UNO): - NRF24L01 模块连接到 Arduino UNO,具体连接方式参考模块的 GPIO 引脚定义。 #### 软件配置 使用 TMRh20 的 RF24 库[^3]来简化 NRF24L01 模块的操作。下载并安装库文件后,可以在 Arduino IDE 中直接调用该库的功能。 #### 发送端代码示例 ```cpp #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> // 定义 NRF24L01 模块的 CE 和 CSN 引脚 RF24 radio(9, 10); // CE, CSN // 定义地址管道 const byte address[6] = "00001"; void setup() { Serial.begin(9600); radio.begin(); radio.openWritingPipe(address); radio.setPALevel(RF24_PA_MIN); radio.stopListening(); } void loop() { int soilMoisture = analogRead(A0); // 读取土壤湿度传感器值 Serial.println(soilMoisture); // 将数据打包为字符串形式发送 char dataToSend[4]; dtostrf(soilMoisture, 4, 0, dataToSend); bool ok = radio.write(&dataToSend, sizeof(dataToSend)); if (ok) { Serial.println("Data sent successfully"); } else { Serial.println("Failed to send data"); } delay(1000); // 每秒发送一次数据 } ``` #### 接收端代码示例 ```cpp #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> // 定义 NRF24L01 模块的 CE 和 CSN 引脚 RF24 radio(9, 10); // CE, CSN // 定义地址管道 const byte address[6] = "00001"; void setup() { Serial.begin(9600); radio.begin(); radio.openReadingPipe(0, address); radio.setPALevel(RF24_PA_MIN); radio.startListening(); } void loop() { if (radio.available()) { char receivedData[4]; radio.read(&receivedData, sizeof(receivedData)); float soilMoisture = atof(receivedData); // 将接收到的数据转换为浮点数 Serial.print("Soil Moisture: "); Serial.println(soilMoisture); } } ``` #### 关键点说明 1. **数据格式**:由于 NRF24L01 不支持直接发送复杂数据类(如 `int64_t`),因此将数据转换为字符串形式进行传输[^2]。 2. **波特率设置**:确保发送端和接收端的串口波特率一致,以便调试时能够正确显示数据。 3. **模块配置**:发送端和接收端必须使用相同的地址管道和功率级别配置[^3]。 ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值