Сравнение строки после ее чтения из Serial не удается
Я купил стартовый комплект Arduino онлайн, все, кажется, работает, но когда я пытаюсь, например, использовать ifs (и другие условные операторы), светодиоды не включаются. Вот код для небольшого проекта, над которым я сейчас работаю:
int redpin = 3;
int greenpin = 2;
int bluepin = 4;
String color;
String msg = "Insert color: ";
void setup() {
// put your setup code here, to run once:
pinMode(redpin,OUTPUT);
pinMode(greenpin,OUTPUT);
pinMode(bluepin,OUTPUT);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println(msg);
while (Serial.available() == 0) {}
color = Serial.readString();
if (color == "red") {
digitalWrite(redpin, HIGH);
digitalWrite(greenpin, LOW);
digitalWrite(bluepin, LOW);
}
if (color == "green") {
digitalWrite(greenpin, HIGH);
digitalWrite(redpin, LOW);
digitalWrite(bluepin, LOW);
}
if (color == "blue") {
digitalWrite(greenpin, LOW);
digitalWrite(redpin, LOW);
digitalWrite(bluepin, HIGH);
}
if (color == "off") {
digitalWrite(greenpin, LOW);
digitalWrite(redpin, LOW);
digitalWrite(bluepin, LOW);
}
}
Я попробовал включить RGB-светодиод с помощью функции single digitalWrite (), и он работает. Я думаю, что операторы if в коде - это проблема. Кстати, я использую Arduino MEGA 2560.
@, 👍2
Обсуждение1 ответ
Лучший ответ:
После color = Serial.ReadString(); color также содержит символ новой строки.
Вы можете удалить это, добавив line color.trim();или, что еще лучше, вообще избежать новой строки, используя Serial.readStringUntil('\n'); который отбрасывает завершающий символ новой строки.
Кроме того, вы можете и, возможно, должны избегать использования класса String и использовать:
char color[10]; // массив char в качестве буфера для чтения с последовательного
int number = Serial.readBytesUntil('\n', color, 10); //Read input and length
color[number] = '\0'; //Завершите строку, добавив '\0' в ее конце
if (strcmp(color, "red") == 0) //Use strcmp(), not ==
соответственно.
- Создание форматированной строки (включая числа с плавающей запятой) в Arduino-совместимом C++
- Arduino Преобразование std:string в String
- Чтение строки, разделенной запятыми
- Использование StringStream в скетче Arduino
- Какова цель F() и FPSTR() в ESP8266WebServer -> FSBrowser?
- Утечка памяти, вызванная конкатенацией строк
- Каков наилучший способ преобразования std::string в строку?
- Чтение и запись в EEPROM
Вы должны вывести переменную
colorна последовательный монитор, чтобы убедиться, что вы действительно получили то, что отправляете. Также вы должны использовать неSerial.ReadString(), аSerial.readStringUntil('\n')и настроить последовательный монитор только на окончание строки новой строки. Затем попробуйте еще раз. Если это сработает, я сформулирую ответ на этот вопрос., @chrisl