Последовательный монитор читает входные строки, но не может остановить оператор 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);
  }
}

, 👍-1

Обсуждение

У вас есть окончания строк, установленные на «Оба 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


1 ответ


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

0

Из ваших комментариев:

Я хочу, чтобы цикл while был там, и я как-то хочу его остановить, такое возможно?

=> да - нажмите кнопку сброса.
Когда я начал программировать несколько десятилетий назад, одной из основ было НИКОГДА не использовать циклы while.
Почему? Потому что вы можете столкнуться с взаимоблокировками, как это происходит с вашим кодом. Варианты:

  • Проверить внутри while изменение состояния/ввод, чтобы разорвать цикл while (худший вариант)
  • Избавьтесь от блокирующего кода (while/delay() ) и работайте с операторами if (средний уровень)
  • Избавьтесь от блокирующего кода (while/delay() ) и реализуйте конечный автомат с переключателем регистра (лучше)

Как избавиться от задержек - IDE-file-examples-2 Digital - blinkwithoutdelay

,