Как правильно использовать AckPayload

Я пытаюсь отправить строку с Arduino (Uno) с помощью Serial. к другому Arduino (Uno). с использованием nRF24l01+. а я использую библиотеку RF24.h Строка отправлена правильно, но у меня проблемы с подтверждением.

Это мой Rx-код.

#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!");}
    }}
  }

а это мой Tx-код

#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));}
    }
}

, 👍0


1 ответ


3

Я не использовал библиотеку RF24, но ниже приведены настройки регистров, которые должны быть записаны во время void setup() для использования функции ACK_PAYLOAD (только для nRF24L01+, не существует на nRF24L01. Проверить вы используете правильную версию радио!)

Передача:

  • 0x00 CONFIG = режим PTX
  • 0x0B RX_PW_P0 = количество байтов данных в канале 0
  • 0x1C DYNPD = 0x01. Включить динамическую полезную нагрузку в канале 0 (установить бит DPL_P0)
  • 0x1D FEATURE = 0x06 (установите биты EN_DPL и EN_ACK_PAY).

Прием

  • 0x00 CONFIG = режим PRX
  • 0x0B RX_PW_P0 = количество байтов данных в канале 0
  • 0x1C DYNPD = 0x01. Включить динамическую полезную нагрузку в канале 0 (установить бит DPL_P0)
  • 0x1D FEATURE = 0x06 (установите биты EN_DPL и EN_ACK_PAY).
  • Наконец, загрузите начальную полезную нагрузку, используя инструкцию OAD W_ACK_PAYL 0xA8, т.е. SPI.transfer(0xA8); SPI.transfer(полезная нагрузка);.
,