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);
}
}
}
@Steven , 👍0
Обсуждение1 ответ
Лучший ответ:
Изменить
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
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
- Очень простая операция Arduino Uno Serial.readString()
- AT-команда не отвечает на последовательный монитор
ваш код плохо отформатирован.... отступы не такие, какими должны быть.... из-за этого очень сложно следить за ходом выполнения программы..... исправьте форматирование, и причина проблемы может стать очевидной сначала взглянуть мельком, @jsotola
@jsotola я отредактировал код, надеюсь, он стал лучше. Также по какой-то причине я попробовал отдельный код (по какой-то причине для массива принималось только 4 строки символов вместо 9), но когда я попытался повторно загрузить этот код, он перестал работать на меня. Все еще повторяю «доступ запрещен», но когда я ввожу «Grantham1», он больше не читает его,, @Steven
я не понимаю, как вы можете запустить этот код.... он содержит ошибки и в результате не компилируется, @jsotola
@jsotola Возможно, поэтому у меня он перестал работать должным образом после того, как я загрузил другой код. Каждый раз, когда я сейчас компилирую новый код, мое окно с ошибкой будет мигать оранжевым, но компиляция завершается. Мне удалось создать более короткий и гораздо более простой код для этой программы, но проблема с последовательным монитором осталась той же. Я обновлю код путем редактирования., @Steven