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: добавлен весь код.
@XIII_, 👍1
Обсуждение1 ответ
Несмотря на то, что вы читаете до \n, это просто определяет конец вашей буферизованной строки. Он не контролирует его запуск. Перед командой, которую вы не вырезали, может быть какой-то мусор. Другими словами, я предлагаю вам проверить, заканчивается ли строка на With, а не == в командной строке.
Что касается того, какой шум мог вызывать мусор или почему действия на стороне передачи серийного номера убрали его, я не знаю. Черт возьми, что-то может быть настолько странным в проводке, что «2» — это просто набор битов, необходимых для усугубления ситуации.
Это интересно, спасибо за участие! Я попробую завтра и проверю, работает ли endWith()., @XIII_
Реальность не обязана соответствовать нашим теориям, но часто у нас есть работа, которая требует от нас приведения наших теорий в соответствие с реальностью. Мне хотелось бы думать, что здесь происходит что-то большее, чем призрак в машине, который ненавидит 2, но любит Б., @Abel
- Почему значение analogRead уменьшается, когда я уменьшаю значение резистора?(Я использую digitalWrite(high) к положительной клемме резистора)
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
- Очень простая операция Arduino Uno Serial.readString()
Выложи весь код. Держу пари, у тебя где-то переполнение памяти., @Delta_G
Спасибо за чтение, я только что добавил весь код. Хотя это были только setup() и 4 определения., @XIII_
Я только что узнал, что символ «2» буквально отбрасывается, когда я печатаю «str» в конце цикла(). Это происходит только с «2», а не с любым другим символом. Поэтому я выберу «A_ON/OFF» и «B_ON/OFF» в качестве управляющих строк и продолжу свой проект. Тем не менее, это не чистое решение, и мне все же хотелось бы знать, почему наблюдается такое поведение., @XIII_