Пустое значение не игнорируется, как должно быть.
Я пытаюсь построить радиоуправляемую плоскость, используя 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();
}
@Osmond Yang, 👍0
Обсуждение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
- Проблема с NRF24L01
- NRF24L01+ (библиотека TMRH20): Получатель получает пустые данные
- Как автоматически сбросить модуль NRF24L01
- nRF24L01 - Измерение расстояния по прошедшему времени
- Проблемы передачи NRF24L01 между Arduino UNO и Arduino Nano
- Проблемы nRF24l01+. Данные принимаются как 0
- Интерфейс Arduino nano ,adxl335 ,nrf24l01
- nRF24L01+ Невозможно установить адрес
«Пустое значение» по сути означает «ничего», то есть функция не возвращает ничего, что можно сохранить. Если вы хотите проверить, доступны ли пакеты, используйте .available() и read(), если вы хотите где-то сохранить эти данные (после того, как вы убедились, что в буфере что-то есть)., @Avamander
Я думаю, что эти примеры могут вам помочь, но это не та библиотека, которую вы, похоже, используете: https://github.com/nRF24/RF24/blob/master/examples/GettingStarted/GettingStarted.ino. (Отказ от ответственности: я являюсь одним из сопровождающих библиотеки, указанной здесь), @Avamander