else if игнорируется, если не Serial.println что-либо до

Я столкнулся с необъяснимым поведением на Arduino Uno. Я серийно читаю строку из серийного монитора/питона. Эта строка является условной для нескольких операторов if/else if. Сумасшествие в том, что некоторые строки просто игнорируются, но если я распечатаю прочитанную строку после ее чтения, игнорируемые операторы будут выполнены, и скрипт будет работать так, как должен. Это код:

// розетка 1
# define OUT_1_1 2 // реле №4
# define OUT_1_2 3 // реле №3

// розетка 2
# define OUT_2_1 4 // реле №2
# define OUT_2_2 5 // реле №1


void setup() {
  pinMode(LED_BUILTIN, OUTPUT);

  // розетка 1
  pinMode(OUT_1_1, OUTPUT);
  pinMode(OUT_1_2, OUTPUT);

  // розетка 2
  pinMode(OUT_2_1, OUTPUT);
  pinMode(OUT_2_2, OUTPUT);

  // инициализируем выходы в HIGH
  digitalWrite(OUT_1_1, HIGH);
  digitalWrite(OUT_1_2, HIGH);
  digitalWrite(OUT_2_1, HIGH);
  digitalWrite(OUT_2_2, HIGH);
  
  Serial.begin(9600);
}

void loop() {
  String str = "";
    
  // проверка наличия байтов в буфере
  if (Serial.available() > 0) {
    str = Serial.readStringUntil("\n");
  }
  // Serial.println(str); // если эта строка раскомментирована serial input "2_ON\n" и "2_OFF\n" распознан и outled 2 успешно переключен


  // личность
  if (str == "IDN\n") {
    Serial.println("Serial Power Outlet");
  }

  // управление розеткой 1
  else if (str == "1_ON\n") {
    digitalWrite(OUT_1_1, LOW);
    digitalWrite(OUT_1_2, LOW);
  }
  else if (str == "1_OFF\n") {
    digitalWrite(OUT_1_1, HIGH);
    digitalWrite(OUT_1_2, HIGH);
  }
  
  // управление розеткой 2
  else if (str == "2_ON\n") {
    digitalWrite(OUT_2_1, LOW);
    digitalWrite(OUT_2_2, LOW);
  }
  else if (str == "2_OFF\n") {
    digitalWrite(OUT_2_1, HIGH);
    digitalWrite(OUT_2_2, HIGH);
  }
  delay(1000);
}

Если я последовательно ввожу 2_ON\n или 2_OFF\n, соответствующие блоки else if просто игнорируются (все остальные входы работают правильно).

Но после того, как я раскомментировал // Serial.println(str);, эти блоки выполняются так, как должны, и все работает просто отлично.

В чем моя ошибка, в чем я ошибаюсь? Эти блоки также выполняются, если я Serial.println любой случайный вывод. Почему я должен что-то Serial.println сначала, чтобы мой скрипт работал по плану? Что я упускаю?

EDIT: добавлен весь код.

, 👍1

Обсуждение

Выложи весь код. Держу пари, у тебя где-то переполнение памяти., @Delta_G

Спасибо за чтение, я только что добавил весь код. Хотя это были только setup() и 4 определения., @XIII_

Я только что узнал, что символ «2» буквально отбрасывается, когда я печатаю «str» в конце цикла(). Это происходит только с «2», а не с любым другим символом. Поэтому я выберу «A_ON/OFF» и «B_ON/OFF» в качестве управляющих строк и продолжу свой проект. Тем не менее, это не чистое решение, и мне все же хотелось бы знать, почему наблюдается такое поведение., @XIII_


1 ответ


1

Несмотря на то, что вы читаете до \n, это просто определяет конец вашей буферизованной строки. Он не контролирует его запуск. Перед командой, которую вы не вырезали, может быть какой-то мусор. Другими словами, я предлагаю вам проверить, заканчивается ли строка на With, а не == в командной строке.

Что касается того, какой шум мог вызывать мусор или почему действия на стороне передачи серийного номера убрали его, я не знаю. Черт возьми, что-то может быть настолько странным в проводке, что «2» — это просто набор битов, необходимых для усугубления ситуации.

,

Это интересно, спасибо за участие! Я попробую завтра и проверю, работает ли endWith()., @XIII_

Реальность не обязана соответствовать нашим теориям, но часто у нас есть работа, которая требует от нас приведения наших теорий в соответствие с реальностью. Мне хотелось бы думать, что здесь происходит что-то большее, чем призрак в машине, который ненавидит 2, но любит Б., @Abel