Получение неправильного значения из 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");//отправляет последовательное сообщение, подтверждающее, что оно включено
}
@Jordi Fuentes, 👍0
Обсуждение1 ответ
Это
int led = Serial.read();
выполняется перед настройкой()
и циклом ()
только один раз. Все инициализации вне какой-либо функции выполняются до запуска программы. Вы еще не выполнили Serial.begin
.
Вы, наверное, хотите прочитать внутри цикла
...
Изменить:
Вторая проблема: вы вызываете цикл
рекурсивно
void loop()
{
if(Serial.available()) {
Serial.println(led);
loop();
Когда байт будет доступен в последовательном порту, вы вызовете цикл
. Поскольку вы никогда не читали последовательный порт, Serial.available
все равно вернет > 0, и вы введете бесконечную рекурсию.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
С какой стати ты вызываешь петлю из петли? Это отвратительно и ведет к бесконечной рекурсии и сбою., @Majenko