Новичок, изучающий Serial.readString()
Новое в Arduino: доступ к строковым переменным и чтение их из последовательного монитора. По сути, я пытаюсь сделать так, чтобы пользовательский ввод был красным, зеленым, желтым. В какую бы строку они ни вошли, загорается светодиод.
Похоже, что происходит то, что операторы if неверны и никогда не вводятся, поэтому светодиоды не загораются. У меня есть serial.Println(myColor) в конце, который отображает myColor, поскольку пользователь ввел его в последовательный монитор. Я просто не понимаю, почему операторы if не срабатывают. это действительно странно.
String msg="What LED do you want to turn on?";
String myColor;
int redPin = 12;
int greenPin = 13;
int yellowPin = 8;
void setup(){
Serial.begin(9600);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
}
void loop(){
//LED ColorDEmo
Serial.println(msg); //выводим вопрос на серийный монитор
while(Serial.available() == 0){ //пока ждем, ничего не делаем, пока данные не станут доступны
}
myColor = Serial.readString(); // установить myColor в серийное значение
if (myColor == "red"){ // если значение красное
Serial.println("In red");
turnOffLEDS(); // выключаем все светодиоды
digitalWrite(redPin, HIGH); // включить красный светодиод
}
if (myColor == "green"){ // если значение зеленое
Serial.println("In green");
turnOffLEDS(); // выключаем все светодиоды
digitalWrite(greenPin, HIGH); // включить зеленый светодиод
}
if (myColor == "yellow"){ // если значение желтое
Serial.println("In yellow");
turnOffLEDS(); // выключаем все светодиоды
digitalWrite(yellowPin, HIGH); // включить желтый светодиод
}
Serial.println(myColor); // напечатать мой цвет
}
// выключает все светодиоды
void turnOffLEDS(){
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(redPin, LOW);
}
@Moose, 👍1
Обсуждение2 ответа
спасибо, @jsotola
путем отладки, о которой вы упомянули, я смог узнать, что '\n' был добавлен в конец строки. Вместо использования
Serial.readString()
Я использовал Serial.readStringUntil('\n');
это проверит символ-разделитель '\n', а затем остановится. Таким образом, моя переменная myColor будет красной, а не красной'\n'
Избегание объектов String (назад к основам) часто упрощает жизнь. Просто проверьте, содержит ли ответ один из символов 'd' 'g' 'y'
Или (и) упростите свой протокол, чтобы отправлять только один символ.
Кстати: вы можете заметить задержку в readString, ожидая завершения многосимвольного ввода, поскольку Serial. available() имеет значение true уже после первого символа ввода, а readString завершается, только если истекает время ожидания
это хорошая идея, упростить до отдельных символов., @Moose
- Arduino Преобразование std:string в String
- Чтение строки, разделенной запятыми
- Arduino Serial.ReadString() проблема
- String() против char для простого управления потоком
- Как анализировать многострочные последовательные данные с неизвестным количеством строк?
- Найдите ОК или ОШИБКУ в последовательной строке
- Команда через последовательный монитор не работает должным образом в Arduino
- Очистка последовательных данных для новых входящих значений
отладьте свой код, распечатав данные на последовательной консоли... напечатайте полученное сообщение и распечатайте длину сообщения, @jsotola
myColor = Serial.readString(); Serial.println(myColor.length()); Serial.println (мой цвет) полученные результаты 4 красный Таким образом, кажется, что он прикрепляет дополнительный символ к концу переменной String. Должен ли я вместо этого использовать readStringUntil(), @Moose
Просто небольшой побочный момент: хорошо привыкнуть к использованию массивов символов, а не строк. Я знаю, что в настоящее время ардуино движется, чтобы удерживать пользователей на уровне любовников (покупая больше щитов), но как только вы доберетесь до более сложных задач и вам придется иметь дело с объемом памяти, привычка использовать массив символов облегчит вашу жизнь. последний., @Tomas
Спасибо @Tomas, это действительно хороший момент. Строковые переменные потребляют память, судя по тому, что я слышал и от других., @Moose
Кроме того, что должна делать программа, если пользователь вводит «RED» вместо «red», только «RE», только «R» и т. д. Вот почему односимвольные ответы обычно лучше и менее подвержены ошибкам., @user3765883