Сравнение строки после ее чтения из 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