RF24, если операторы не читаются должным образом, даже если значение «if» неверно, оно все равно следует за соответствующим кодом.

Мой код принимает значения с пульта дистанционного управления и передает его состояние. Сейчас состояния — это всего лишь 1 и 0, включено или выключено, и запись ведется через последовательный монитор на передающем Arduino. На принимающем радиочастотном модуле я не могу заставить операторы if работать правильно

Код передатчика:

const char a[] = "1";
const char b[] = "0";
void loop() {
if (Serial.available ( ) > 0) 
{
char state = Serial.read(); // считываем значение с пульта

if (state >= 0)
{
digitalWrite (7, HIGH); //включение светодиода на макетной плате передачи для сравнения с макетной платой приема
radio.write(&a, sizeof(a)); //сообщаем другому Arduino, что значение равно 1
}
if (state < 0)
{
digitalWrite(7,LOW);
radio.write(&b,sizeof(b)); //сообщаем другому значению arduino 0
}
}

Код получателя:

void loop()
{
if (radio.available())
{
char state[32] = {0};

radio.read(&state, sizeof(state));
Serial.println(state);
int a = state;
if (a = 1);
{
  digitalWrite(7,HIGH);
  Serial.println("do something");
}
if (a = 0);
{
digitalWrite(7,LOW);
Serial.println("do nothing");
}
}

получение последовательного монитора

1
do something
do nothing
0
do something
do nothing
0
do something
do nothing

и мой свет на принимающем Arduino не горит, почему он печатает оба утверждения? A равно 1, но он печатает значение, которое должно быть напечатано, когда a также равно 0, я так запутался

, 👍-3

Обсуждение

напечатайте sizeof(state) также... это то, что вы ожидаете?, @jsotola

если (а = 1); { ... если (а = 0); { У вас там четыре опечатки. Как минимум два из них будут вам показаны, если вы повысите уровень предупреждения в настройках IDE., @timemage

Начните с простого кода, который, как известно, работает, например: https://forum.arduino.cc/t/simple-nrf24l01-2-4ghz-transceiver-demo/405123/2. Serial.read() возвращает отрицательное значение (-1), если данные недоступны, но вы уже проверили их доступность перед вводом команды. Опубликованный вами код в любом случае плохо отформатирован и неполный., @6v6gt

@timemage Не могли бы вы дать ответ? Комментарий предназначен для разъяснения вопроса., @Nick Gammon

@6v6gt Ваш комментарий не запрашивает дополнительную информацию по вопросу., @Nick Gammon

@NickGammon Короче говоря: нет. Вы демонстрируете, что не понимаете цели моего комментария., @timemage


1 ответ


Лучший ответ:

0
if (a = 1);
{
  digitalWrite(7,HIGH);
  Serial.println("do something");
}

Здесь есть две основные проблемы. В C++ вы проверяете равенство ==, а не =.

Во-вторых, установка точки с запятой после if завершает область действия if.

Это должно читаться:

if (a == 1)
{
  digitalWrite(7,HIGH);
  Serial.println("do something");
}

char state[32] = {0};

radio.read(&state, sizeof(state));
Serial.println(state);
int a = state;

state — это массив. Если вы присвоите это a, вы получите тот же массив в другой переменной. Этот массив не будет равен нулю или единице.

Возможно, вы имели в виду:

int a = state [0];
,