Как правильно использовать 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));}
}
}
@M.HARTAOUI, 👍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(полезная нагрузка);
.
,
@MichaelT
Смотрите также:
- вопрос по трубке nRF24L01
- Как подключить NodeMCU к NRF24L01
- Переключение каналов NRF24l01
- Использование функции уровня сигнала модуля nRF24L01
- Как автоматически сбросить nrf24l01+ с кодом?
- NRF24L01+ PA не работает с Arduino Mega (работает с Nano)
- Пустое значение не игнорируется, как должно быть.
- Не получаем данные от NRF24L01