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

Обсуждение

Вы должны вывести переменную color на последовательный монитор, чтобы убедиться, что вы действительно получили то, что отправляете. Также вы должны использовать не Serial.ReadString(), а Serial.readStringUntil('\n') и настроить последовательный монитор только на окончание строки новой строки. Затем попробуйте еще раз. Если это сработает, я сформулирую ответ на этот вопрос., @chrisl


1 ответ


Лучший ответ:

3

После 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 ==

соответственно.

,