Последовательный монитор читает входные строки, но не может остановить оператор while
Я только что изучил что-то под названием «протоколы связи» в Arduino, пока я тестировал этот код, мне кажется, что каждый раз, когда я ввожу строку «YELLOW_ON», оператор while работает отлично, однако после этого последовательный ввод монитора больше не может получать строки. после ввода строки «YELLOW_ON» я не могу ввести другую строку «YELLOW_OFF», могу ли я узнать, почему это так?
#include"Display.h"
const int YELLOW_LED = 7;
void setup()
{
pinMode(YELLOW_LED, OUTPUT);
Serial.begin(9600);
}
void loop()
{
if (Serial.available())
{
INPUT_SERIAL();
}
}
void INPUT_SERIAL()
{
String INPUT_INFO = Serial.readStringUntil('\n');
Serial.println(INPUT_INFO);
while (INPUT_INFO == "YELLOW_ON")
{
Display.show("ON");
digitalWrite(YELLOW_LED, HIGH);
delay(250);
digitalWrite(YELLOW_LED, LOW);
delay(250);
}
if (INPUT_INFO == "YELLOW_OFF")
{
Display.show("OFF");
digitalWrite(YELLOW_LED, LOW);
}
}
@Ryan johnson, 👍-1
Обсуждение1 ответ
Лучший ответ:
Из ваших комментариев:
Я хочу, чтобы цикл while был там, и я как-то хочу его остановить, такое возможно?
=> да - нажмите кнопку сброса.
Когда я начал программировать несколько десятилетий назад, одной из основ было НИКОГДА не использовать циклы while.
Почему? Потому что вы можете столкнуться с взаимоблокировками, как это происходит с вашим кодом. Варианты:
- Проверить внутри while изменение состояния/ввод, чтобы разорвать цикл while (худший вариант)
- Избавьтесь от блокирующего кода (while/delay() ) и работайте с операторами if (средний уровень)
- Избавьтесь от блокирующего кода (while/delay() ) и реализуйте конечный автомат с переключателем регистра (лучше)
Как избавиться от задержек - IDE-file-examples-2 Digital - blinkwithoutdelay
- avrdude ser_open() can't set com-state
- Float печатается только 2 десятичных знака после запятой
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Печать массива байтов на экране последовательного монитора Arduino IDE
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
- Arduino IDE Отказано В Разрешении На Загрузку, Ubuntu
- Нет заголовочных файлов (.h) в Documents\Arduino\libraries\arduino_144469 с демонстрационным кодом
- Связь Arduino master/slave с использованием RS485
У вас есть окончания строк, установленные на «Оба CR и NL» в последовательном мониторе?, @Majenko
@mejenko, что вы подразумеваете под установкой как CR, так и NL, не могли бы вы уточнить?, @Ryan johnson
В Serial Monitor в IDE есть раскрывающийся список, в котором задаются «концы строк». Что установлено в этом раскрывающемся списке?, @Majenko
Ага! да, теперь я понял, он был установлен на новую строку. Однако, когда я изменил его как на CR, так и на NL, последовательный монитор получает входные строки, но ничего не делает;/, @Ryan johnson
Хорошо, New Line — это то, что вам нужно. «CR и NL» вызовут проблемы., @Majenko
@Majenko, к сожалению, если я добавлю новую строку, она будет работать только для одной строки и перестанет получать строки;/, @Ryan johnson
как может измениться INPUT_INFO в цикле while?, @Juraj
@Juraj Хорошо замечен. Да.
while (INPUT_INFO == "YELLOW_ON")
на самом деле должно бытьif (INPUT_INFO == "YELLOW_ON")
., @Majenko@Juraj, я не знаю, что вы имеете в виду, но я хочу, чтобы цикл while был там, и я каким-то образом хочу его остановить, это возможно? Я хочу постоянно мигать светодиодом, а затем остановить его, введя строку в последовательный монитор, @Ryan johnson
@Majenko, тогда не было причин для OFF. Я не знаю, как отвечать на вопросы с неправильной логикой. у этого скетча так много проблем. некоторые из них являются формальными, например, использование всех прописных букв для имени переменной, имени функции и т. д. ОП должен пройти курс кодирования., @Juraj