Новичок, изучающий 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);
}

, 👍1

Обсуждение

отладьте свой код, распечатав данные на последовательной консоли... напечатайте полученное сообщение и распечатайте длину сообщения, @jsotola

myColor = Serial.readString(); Serial.println(myColor.length()); Serial.println (мой цвет) полученные результаты 4 красный Таким образом, кажется, что он прикрепляет дополнительный символ к концу переменной String. Должен ли я вместо этого использовать readStringUntil(), @Moose

Просто небольшой побочный момент: хорошо привыкнуть к использованию массивов символов, а не строк. Я знаю, что в настоящее время ардуино движется, чтобы удерживать пользователей на уровне любовников (покупая больше щитов), но как только вы доберетесь до более сложных задач и вам придется иметь дело с объемом памяти, привычка использовать массив символов облегчит вашу жизнь. последний., @Tomas

Спасибо @Tomas, это действительно хороший момент. Строковые переменные потребляют память, судя по тому, что я слышал и от других., @Moose

Кроме того, что должна делать программа, если пользователь вводит «RED» вместо «red», только «RE», только «R» и т. д. Вот почему односимвольные ответы обычно лучше и менее подвержены ошибкам., @user3765883


2 ответа


0

спасибо, @jsotola

путем отладки, о которой вы упомянули, я смог узнать, что '\n' был добавлен в конец строки. Вместо использования Serial.readString() Я использовал Serial.readStringUntil('\n');

это проверит символ-разделитель '\n', а затем остановится. Таким образом, моя переменная myColor будет красной, а не красной'\n'

,

1

Избегание объектов String (назад к основам) часто упрощает жизнь. Просто проверьте, содержит ли ответ один из символов 'd' 'g' 'y'

Или (и) упростите свой протокол, чтобы отправлять только один символ.

Кстати: вы можете заметить задержку в readString, ожидая завершения многосимвольного ввода, поскольку Serial. available() имеет значение true уже после первого символа ввода, а readString завершается, только если истекает время ожидания

,

это хорошая идея, упростить до отдельных символов., @Moose