Пустое значение не игнорируется, как должно быть.

Я пытаюсь построить радиоуправляемую плоскость, используя Arduino Nano и nrf24l01 в качестве приемника, но у меня возникли некоторые проблемы с кодом

в строке ошибка done = radio.read(joystick,sizeof(joystick)); который говорит, что значение void не игнорируется, как должно быть

весь код ниже

#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>
#include <SPI.h>
#include<Servo.h>

Servo Throttle,Rudder,Elevator,LeftAileron,RightAileron ;

const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(9,10);
int joystick[5];

void setup()
{
  /*Serial.begin(9600);
  delay(1000);
  Serial.println("Starting Rx");*/ //Включаем последовательный порт для отладки

  attachMotors();

  calibrateMotors();

  radio.begin();

  detachMotors();

  radio.setPALevel(RF24_PA_MAX);
  radio.setPayloadSize(10);
  radio.setDataRate(RF24_250KBPS);
  radio.setRetries(15,15);

  radio.openReadingPipe(1,pipe);
  radio.startListening();;
}

void loop()
{
  detachMotors();

  if(radio.available())
  {
    bool done=false;
    while(!done)
    {
      done=radio.read(joystick,sizeof(joystick));
    }

  attachMotors();

  int a=joystick[0];
  int b= joystick[1]; //сохраняет значения из tx
  int c=joystick[2];
  int d=joystick[3];
  int e=joystick[4];

  //Serial.println(а);
  //Serial.println(b);
  //Serial.println(c);
  //Serial.println(d);
  //Serial.println(e);
 // Serial.println(f);

  delay(20);
  Throttle.writeMicroseconds(a);   //записываем значения в двигатель
  Rudder.write(b);
  Elevator.write(180-c);

  if(d== LOW)
  {
  LeftAileron.write(180); ////для активации правого элерона
  RightAileron.write(180);
  delay(15);
  }

  else if(e == LOW)
  { 
    LeftAileron.write(0);  //чтобы активировать левый элерон
    RightAileron.write(0);
    delay(15);
  }
  else
  {
    LeftAileron.write(100);
    RightAileron.write(110); //Элероны в нейтральном положении
    delay(15);
  }
    }
  else
  {
    calibrateMotors();
    delay(15);

  }
  }

void attachMotors()
{
  Throttle.attach(3);
  Rudder.attach(4);
  Elevator.attach(5);
  LeftAileron.attach(6);
  RightAileron.attach(7); 
}

void calibrateMotors()
{
  Rudder.write(90);
  Elevator.write(90);
  LeftAileron.write(100);
  RightAileron.write(110); //центрирование сервовалов
}

void detachMotors()
{
  Throttle.detach();
  Rudder.detach();
  Elevator.detach();
  LeftAileron.detach();
  RightAileron.detach();
}

, 👍0

Обсуждение

«Пустое значение» по сути означает «ничего», то есть функция не возвращает ничего, что можно сохранить. Если вы хотите проверить, доступны ли пакеты, используйте .available() и read(), если вы хотите где-то сохранить эти данные (после того, как вы убедились, что в буфере что-то есть)., @Avamander

Я думаю, что эти примеры могут вам помочь, но это не та библиотека, которую вы, похоже, используете: https://github.com/nRF24/RF24/blob/master/examples/GettingStarted/GettingStarted.ino. (Отказ от ответственности: я являюсь одним из сопровождающих библиотеки, указанной здесь), @Avamander


1 ответ


1

Что-то изменилось, пока вы смотрели в сторону. Это обновленное описание read(). Как видите, он больше не возвращает bool. Используйте available, чтобы определить, доступны ли пакеты:

/**
* Прочитайте доступную полезную нагрузку
*
* Размер считываемых данных — это фиксированный размер полезной нагрузки, см. getPayloadSize().
*
* @note Я специально выбрал «void*» в качестве типа данных, чтобы было проще
* для начинающих. Никакого кастинга не нужно.
*
* @note Больше не логическое значение. Используйте доступный, чтобы определить, являются ли пакеты
* доступный. Флаги прерываний теперь сбрасываются во время чтения, а не во время чтения.
* при вызове доступного().
*
* @param buf Указатель на буфер, куда должны быть записаны данные
* @param len Максимальное количество байтов для чтения в буфер
*
* @код
* if(radio.available()){
* radio.read(&data,sizeof(data));
* } 
void read( void* buf, uint8_t len );
,

Не могли бы вы исправить мне код, потому что я недавно начал работать на платформе Arduino и мало что знаю. Я скопировал и вставил этот код откуда-то еще :(, @Osmond Yang

Лучший способ научиться — сделать это самостоятельно. В этом ответе также есть небольшой фрагмент кода, показывающий, как читать данные из nRF24L01(+), вы пробовали? Примеры в папке «examples» также покажут вам, как использовать библиотеку, если вы все еще не можете в ней разобраться., @Avamander

ок, я попробую понять примеры, @Osmond Yang