Serial Monitor повторяет вывод

Я приношу извинения за постоянные сообщения здесь. Однако я столкнулся с проблемой и не могу найти решения. Цель состоит в том, чтобы ввести имя пользователя с помощью функции Serial.read, и если имя пользователя совпадает, он просто отвечает «Добро пожаловать, Стивен» и зажигает зеленый светодиод, а когда введено неправильное имя пользователя, он отвечает «Доступ запрещен» и загорается красный. ВЕЛ. На данный момент код работает в ответ на предоставление или отказ в доступе, одновременно зажигая соответствующие светодиоды. Однако последовательный монитор не ждет, пока пользователь введет данные, он автоматически запускается с сообщением «доступ запрещен» и зажигает красный светодиод. При вводе имени пользователя красный светодиод гаснет, зеленый светодиод загорается, и последовательный монитор постоянно отвечает «Добро пожаловать, Стивен». Я могу сделать это несколько раз, и каждый раз состояние будет меняться. Я просмотрел множество руководств и прочитал здесь множество сообщений, касающихся проблем, но пока ничего не получилось. Даже попробовал внести изменения, предложенные NickGammon в другом посте. Хотелось бы избавиться от повторяющейся проблемы и дождаться ввода пользователя, прежде чем появится сообщение об отказе или предоставлении доступа.

int led1 = 9;
int led2 = 10;
String user_name;

void setup()
{
  Serial.begin(9600);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  Serial.println("Enter Username");
}

void loop()
{
 if(Serial.available())
   user_name = Serial.readStringUntil('\n');
{

if(user_name == "Grantham1")
{
  Serial.println("Welcome Steven");
  digitalWrite(led1, HIGH);
  digitalWrite(led2, LOW);
}
else if(user_name != "Grantham1")
{
  Serial.println("Invalid Input");
  digitalWrite(led1, LOW);
  digitalWrite(led2, HIGH);
}
else
{
  Serial.println("Waiting Pateintly");
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
}
}
}

, 👍0

Обсуждение

ваш код плохо отформатирован.... отступы не такие, какими должны быть.... из-за этого очень сложно следить за ходом выполнения программы..... исправьте форматирование, и причина проблемы может стать очевидной сначала взглянуть мельком, @jsotola

@jsotola я отредактировал код, надеюсь, он стал лучше. Также по какой-то причине я попробовал отдельный код (по какой-то причине для массива принималось только 4 строки символов вместо 9), но когда я попытался повторно загрузить этот код, он перестал работать на меня. Все еще повторяю «доступ запрещен», но когда я ввожу «Grantham1», он больше не читает его,, @Steven

я не понимаю, как вы можете запустить этот код.... он содержит ошибки и в результате не компилируется, @jsotola

@jsotola Возможно, поэтому у меня он перестал работать должным образом после того, как я загрузил другой код. Каждый раз, когда я сейчас компилирую новый код, мое окно с ошибкой будет мигать оранжевым, но компиляция завершается. Мне удалось создать более короткий и гораздо более простой код для этой программы, но проблема с последовательным монитором осталась той же. Я обновлю код путем редактирования., @Steven


1 ответ


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

2

Изменить

if(Serial.available())
    user_name = Serial.readStringUntil('\n');
{

в

if(Serial.available()) {
    user_name = Serial.readStringUntil('\n');

Изменить: причина, по которой это не работало должным образом, заключалась в том, что все последующие if оценивались повторно независимо от того, было ли что-то новое в последовательном буфере или нет. Модификация устраняет эту проблему.

,

Это сработало, спасибо. Я думал, что у меня там есть все необходимое {}. Я немного удивлен, что компилятор не выдал мне ошибку из-за их отсутствия при загрузке., @Steven

@Steven Команда if (оператор); полностью допустима в C++ и в отдельном блоке { Commands; } также совершенно корректен в C++., @KIIV

@Стивен, прими ответ, если он работает сейчас, @Juraj

@Juraj Принял ответ, прошу прощения за то, что это заняло так много времени., @Steven

@KIIV Я средний уровень владения C++, возможно, поэтому у меня так много проблем с кодированием в Arduino. Хотел бы я просто писать на Python, чтобы этот язык имел для меня гораздо больше смысла., @Steven