Почему Arduino не проходит через if / then / elseif, как ожидалось, при получении байтов через последовательный порт? - PullRequest
0 голосов
/ 10 апреля 2019

Я работаю над проектом, в котором Arduino должен делать разные вещи, основываясь на разных персонажах (a, b и т. Д.), Получаемых через Serial.Я получил его, чтобы ответить, но я столкнулся с логической ошибкой.Когда я ввожу a, он делает так, как требуется, и выполняет процедуру мягкого сброса (заземление контакта сброса через резистор для удаленного сброса).Однако, когда я делаю b (или любой другой из 30-ти других символов, ни один из которых не идентичен), он выполняет команду a.Он должен, исходя из моей логики, не делать код a начиная с incomingByte != 'a', но он делает = b.Почему работает a, а не что-нибудь еще?Спасибо за любую помощь.

PS Я знаю, что есть другие способы сделать это, которые, вероятно, более «правильные», но я бы хотел придерживаться этой логики if / then / elseif, если это возможно.

Я приложил часть кода ниже, есть намного больше, поэтому я знаю, что там может быть пропущен } где-то в конце, но он есть в коде.

void loop() {
    char incomingByte;
    //wait for commands
    if (Serial.available() > 0) {
    // read the incoming byte:
    incomingByte = Serial.read();

    bool alarmState = false;
    //variable for storing status of the alarm system for use during unsilence controls, to ensure operator cannot
    //unsilence a non-alarmed system and cause audible signals to activate prematurely

    //use incomingByte as the command byte in ain if/then/elseif
    if (incomingByte = "a") {
    //code to soft-reset
      //output reset confirmation
      tone(buzzer, 600, 500);
      Serial.println("System reset in progress...");
      delay(100);
      digitalWrite(powerLED, LOW);
      delay(500);
      digitalWrite(powerLED, HIGH);
      delay(500);
      digitalWrite(powerLED, LOW);
      delay(500);
      digitalWrite(powerLED, HIGH);
      delay(500);
      digitalWrite(powerLED, LOW);
      delay(500);
      digitalWrite(powerLED, HIGH);
      delay(500);
      digitalWrite(powerLED, LOW);
      delay(250);
      digitalWrite(resetPin, LOW);
      digitalWrite(troubleLED, HIGH);
      delay(100);
      digitalWrite(resetPin, HIGH);  //this is needed to complete the reset

    }
    else if (incomingByte = "b") {
      //code to silence audible signals
      if (alarmState = true) {
      digitalWrite(NAC1, LOW);
      digitalWrite(silenceLED, HIGH);
      digitalWrite(silence1, HIGH);
      Serial.println("Audible signals silenced");
      }
      else if (alarmState = false) {
        Serial.println("The system is not in alarm and the NAC state could not be modified. If you need to manually override NAC states without system alarm, use the System menu.");
      }
    }
    else if (incomingByte = "c") {
      //code to unsilence audible signals
      if (alarmState = true) {
      digitalWrite(NAC1, HIGH);
      digitalWrite(silenceLED, LOW);
      digitalWrite(silence1, LOW);
      Serial.println("Audible signals unsilenced");
      }
      else if (alarmState = false) {
        Serial.println("The system is not in alarm and the NAC state could not be modified. If you need to manually override NAC states without system alarm, use the System menu.");
      }

1 Ответ

0 голосов
/ 10 апреля 2019

То, что вы здесь делаете, это не сравнение, а задание, которое всегда будет возвращаться как истинное.

if (incomingByte = "a") {

Сравнение в c ++ должно быть выполнено следующим образом

if (incomingByte == 'a') {

Это также относится к другим сравниваемым символам и логическим данным.

Внесите это изменение, и ваш код будет введен правильно, если еще условие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...