Получение неправильного значения из Serial.read()

У меня есть RGB-светодиод, подключенный к моему UNO R3, и я хотел бы включить записанный цвет в серийном номере, следуя таблице (1 для красного, 2 для синего, 3 для зеленого...), и я также хочу сделать так, чтобы если этот светодиод уже включен, то я хочу, чтобы он выключился. Проблема у меня в том, что когда я использую Serial.read (), он всегда возвращает значение -1. Почему это? Я оставляю вам код здесь, и если вы увидите, что что-то не так, пожалуйста, скажите мне. Большое спасибо.

#define RED 7
#define GREEN 4
#define BLUE 2
  String ledcolour[] = {"RED", "BLUE", "GREEN", "YELLOW", "PURPLE", "WHITE"}; //array to match the number typed to the LED colour 
  char ledstatus[] = {0, 0, 0, 0, 0, 0}; //0 if the LED is OFF and 1 if it's ON
  String ledvaluefix[] = {"HIGH", "LOW"}; //if the ledstatus[] value is 0 it will write HIGH and if it's already ON it will write LOW
  char ledstatusfix[] = {1,0}; //чтобы обновить в ledstatus[] если индикатор включен или выключен
  int led = Serial.read();
void setup() {
  pinMode(RED,OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE,OUTPUT);  
  Serial.begin(9600);
  Serial.println("Введите цвет светодиода, который вы хотите включить, следуя этой таблице:");
  Serial.println("RED=1");
  Serial.println("BLUE=2");
  Serial.println("GREEN=3");
  Serial.println("YELLOW=4");
  Serial.println("PURPLE=5");
  Serial.println("WHITE=6");  
}

void loop() {
  if (Serial.available()){
    Serial.println(led);
    loop();
   if (led <= 6 && led >=1){ //Проверяет, находится ли значение в пределах 0-6
    if (led <=3){ //Classifies in primary or mixed colours (understand primary as just having to turn ON one single LED)
      if (ledstatus[led-1] == 0){//проверяет не погас ли светодиод
        digitalWrite(led-1,HIGH);//переводит набранный светодиод в режим HIGH
        char ledstatus[led-1] = {1};//бновляет массив чтобы установить что светодиод теперь горит
        confirmer();//отправляет последовательное подтверждающее сообщение
      }else{//если он уже был ВКЛЮЧЕН
        digitalWrite(led-1,LOW);//переводит набранный светодиод в режим LOW
        char ledstatus[led-1] = {0};//обновляет массив для установки светодиода теперь ВЫКЛЮЧЕН
      }
    }else{//если это не основной цвет
      Serial.println("ВЫ ВЫБРАЛИ " + ledcolour[led-1] + ", КОТОРЫЙ ЯВЛЯЕТСЯ СМЕШАННЫМ ЦВЕТОМ");
    }
    }else{//если значение недопустимо (не между 0 и 6)
      Serial.println("ИЗВИНИТЕ, ВВЕДЕННОЕ ЗНАЧЕНИЕ НЕДОПУСТИМО");
      Serial.println("ПОЖАЛУЙСТА, ПОПРОБУЙТЕ ЕЩЕ РАЗ");
    }
  }
}
 int confirmer(){
    Serial.println("ВЫ ВЫБРАЛИ" + ledcolour[led-1] + "LED");//отправляет последовательное сообщение, подтверждающее, что оно включено
   }

, 👍0

Обсуждение

С какой стати ты вызываешь петлю из петли? Это отвратительно и ведет к бесконечной рекурсии и сбою., @Majenko


1 ответ


1

Это

 int led = Serial.read();

выполняется перед настройкой() и циклом ()только один раз. Все инициализации вне какой-либо функции выполняются до запуска программы. Вы еще не выполнили Serial.begin.

Вы, наверное, хотите прочитать внутри цикла ...

Изменить:

Вторая проблема: вы вызываете цикл рекурсивно

void loop()
{
    if(Serial.available()) {
        Serial.println(led);
        loop();

Когда байт будет доступен в последовательном порту, вы вызовете цикл. Поскольку вы никогда не читали последовательный порт, Serial.available все равно вернет > 0, и вы введете бесконечную рекурсию.

,