0

i'm trying to send String from an Arduino(Uno) using the Serial. to an another Arduino(Uno). using nRF24l01+. and I'm using the library RF24.h the String is sended correctly but I have some problems with the acknowledgement.

This is my Rx code.

#include<SPI.h> #include<nRF24L01.h> #include<RF24.h> const uint64_t pipe[1]= {0xF0F0F0F0E1LL}; RF24 radio(9,10); char buf[32]= ""; char false_buf[32]= "MKJK212U1H7"; void setup() { Serial.begin(115200); radio.begin(); radio.setChannel(0x35); radio.setAutoAck(true); radio.enableAckPayload(); radio.enableDynamicPayloads(); radio.openReadingPipe(1,pipe[0]); radio.startListening(); radio.setRetries(1,15); radio.writeAckPayload( 1, false_buf, sizeof(false_buf) ); } void loop() { int OkMsg; while(!radio.available()){}; if ( radio.available() > 0) { radio.read(&buf,sizeof(buf) ); Serial.println(buf); radio.writeAckPayload( 1, buf, sizeof(false_buf) ); while(!radio.available()){}; if ( radio.available() > 0) { radio.read(&OkMsg,sizeof(OkMsg) ); Serial.println(OkMsg); if(OkMsg == 1){Serial.println("OkMsg's true!");} else {Serial.println("OkMsg's false!");} }} } 

and this is my Tx code

#include <SPI.h> #include <RF24.h> #include <nRF24L01.h> RF24 radio(9, 10); // CE, CSN const uint64_t pipe[1]= {0xF0F0F0F0E1LL}; char CharToSend[32]= "" ; char Ack[32]= "" ; String inputString = ""; String Allconfiguration = ""; boolean stringComplete = false; char inChar; boolean isConnected = false; int OkMsg = 0; void setup() { SPI.begin(); Serial.begin(115200); RadioSetupTransmiter(); } void loop() { if(stringComplete) { if(Allconfiguration.startsWith("\n")){Allconfiguration.remove(0,1);} Allconfiguration.remove(Allconfiguration.length()); inputString = ""; Serial.print("Allconfiguration : "); Serial.println(Allconfiguration); int counter = 0; for(int i=0; i<Allconfiguration.length(); i++) { if((Allconfiguration[i] == '\n')&&(i!=Allconfiguration.length())) { int pre_counter = counter; counter = i+1; inputString = Allconfiguration.substring(pre_counter, counter); if(inputString[0]!='$'){inputString.toCharArray(CharToSend,32);} if(radio.write(&CharToSend, sizeof(CharToSend))) {CheckData(); Serial.print("inputString : "); Serial.print(CharToSend);} } if(i == Allconfiguration.length()){ const char EndChar[2] = "$"; } inputString = ""; } Allconfiguration = ""; stringComplete = false; } } void serialEvent() { while (Serial.available()) { char inChar = (char)Serial.read(); Allconfiguration +=inChar; if (inChar == '$'){stringComplete = true; } } } void RadioSetupTransmiter(){ radio.begin(); radio.setChannel(0x35); delay(100); radio.setAutoAck( true ) ; radio.enableAckPayload(); radio.enableDynamicPayloads(); // radio.printDetails(); radio.stopListening(); radio.openWritingPipe(pipe[0]); radio.setRetries(1, 15); } void CheckData(){ int OkMsg = 0; while (!radio.isAckPayloadAvailable()){}; if(radio.isAckPayloadAvailable()) { radio.read(&Ack,sizeof(Ack)); //Serial.println(Ack); if(strcmp(CharToSend,Ack) == 0){ OkMsg = 1 ; Serial.println("AckRecived"); radio.write(&OkMsg,sizeof(OkMsg));} } } 

1 Answer 1

3

I have not used the RF24 libary, but below are the register settings that should be written during void setup() to use the ACK_PAYLOAD functionality (N.B. nRF24L01+ only, does not exist on nRF24L01. Check you are using the right version of the radio!)

TX:

  • 0x00 CONFIG = PTX mode
  • 0x0B RX_PW_P0 = Number of data bytes in pipe 0
  • 0x1C DYNPD = 0x01. Enable dynamic payload on pipe 0 (set DPL_P0 bit)
  • 0x1D FEATURE = 0x06 (set bits EN_DPL and EN_ACK_PAY).

RX

  • 0x00 CONFIG = PRX mode
  • 0x0B RX_PW_P0 = Number of data bytes in pipe 0
  • 0x1C DYNPD = 0x01. Enable dynamic payload on pipe 0 (set DPL_P0 bit)
  • 0x1D FEATURE = 0x06 (set bits EN_DPL and EN_ACK_PAY).
  • Finally, load an initial payload using the W_ACK_PAYLOAD instruction 0xA8, i.e. SPI.transfer(0xA8); SPI.transfer(payload);.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.