Данный код не работает(я - не силён в этом). Что поправить? Code: const int ledPin = 13; // the pin that the LED is attached to const int shimPin = 5; long a; int val; String s1; void setup() { // initialize serial communication: Serial.begin(9600); // initialize the LED pin as an output: pinMode(ledPin, OUTPUT); pinMode(shimPin, OUTPUT); } void loop() { a = 0; int i=0; char s[8]; memset(&s,0,sizeof(s)); while(Serial.available()>0) { s[i]=Serial.read(); i++; delay(2); } if ((strstr(s, "On_1"))||(strstr(s, "Off_1"))){ if (strstr(s, "On_1")){ digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } } if (strstr(s, "IR_LG_CH_")) { s1 = ""; for ( int j=10; j<18; j++){ s1 =s1 + s[j]; switch { case Input: irsend.sendNEC(0x20DFD02F, 32);delay(200); break; case Mute: irsend.sendNEC(0x20DF807F, 32);delay(200); break; case LIST: irsend.sendNEC(0x20DFCA35, 32);delay(200); break; case Q.Menu: irsend.sendNEC(0x20DF58A7, 32);delay(200); break; case V--: irsend.sendNEC(0x20DFC03F, 32);delay(200); break; case V++: irsend.sendNEC(0x20DF40BF, 32);delay(200); break; case Ch++: irsend.sendNEC(0x20DF00FF, 32);delay(200); break; case Ch--: irsend.sendNEC(0x20DF807F, 32);delay(200); break; case Return: irsend.sendNEC(0x20DF14EB, 32);delay(200); break; case Settings: irsend.sendNEC(0x20DFC23D, 32);delay(200); break; case MyApps: irsend.sendNEC(0x20DF42BD, 32);delay(200); break; case OK: irsend.sendNEC(0x20DF22DD, 32);delay(200); break; case Up: irsend.sendNEC(0x20DF02FD, 32);delay(200); break; case Down: irsend.sendNEC(0x20DF827D, 32);delay(200); break; case Left: irsend.sendNEC(0x20DFE01F, 32);delay(200); break; case Right: irsend.sendNEC(0x20DF609F, 32);delay(200); break; case Exit: irsend.sendNEC(0x20DFDA25, 32);delay(200); break; } } } if (strstr(s, "IR_LG_")) { s1 = ""; for ( int j=10; j<18; j++){ s1 =s1 + s[j]; switch { case 1: irsend.sendNEC(0x20DFD02F, 32);delay(200); break; case 2: irsend.sendNEC(0x20DF48B7, 32);delay(200); break; case 3: irsend.sendNEC(0x20DFC837, 32);delay(200); break; case 4: irsend.sendNEC(0x20DF28D7, 32);delay(200); break; case 5: irsend.sendNEC(0x20DFA857, 32);delay(200); break; case 6: irsend.sendNEC(0x20DF6897, 32);delay(200); break; case 7: irsend.sendNEC(0x20DFE817, 32);delay(200); break; case 8: irsend.sendNEC(0x20DF18E7, 32);delay(200); break; case 9: irsend.sendNEC(0x20DF9867, 32);delay(200); break; case 0: irsend.sendNEC(0x20DF08F7, 32);delay(200); break; } } } } Ошибки: Code: Изменена опция сборки, пересобираем все Ard_Blue.ino: In function 'void loop()': Ard_Blue:41: error: expected '(' before '{' token Ard_Blue:101: error: expected '(' before '{' token Ard_Blue.ino: At global scope: Ard_Blue:142: error: expected declaration before '}' token expected '(' before '{' token
Как минимум, ему не нравятся пустые switch в 41 и 101 строке кода. Там не указано какое выражение сравнивать с кейсами. Надо писать вместо switch { в скобках еще выражение, например, switch (s1) { Тогда будет строчка s1, считанная посимвольно из ком-порта в начале кода, сравниваться с другими, прописанными в case-ы.
Поменял как просили - стало еще хуже: Code: #include <IRremote.h> IRsend irsend; const int ledPin = 13; // the pin that the LED is attached to const int shimPin = 5; long a; int val; String s1; void setup() { // initialize serial communication: Serial.begin(9600); // initialize the LED pin as an output: pinMode(ledPin, OUTPUT); pinMode(shimPin, OUTPUT); } void loop() { a = 0; int i=0; char s[8]; memset(&s,0,sizeof(s)); while(Serial.available()>0) { s[i]=Serial.read(); i++; delay(2); } if ((strstr(s, "On_1"))||(strstr(s, "Off_1"))){ if (strstr(s, "On_1")){ digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } } if (strstr(s, "IR_LG_CH_")) { s1 = ""; for ( int j=10; j<18; j++){ s1 =s1 + s[j]; switch (s1) { case Input: irsend.sendNEC(0x20DFD02F, 32);delay(200); break; case Mute: irsend.sendNEC(0x20DF807F, 32);delay(200); break; case LIST: irsend.sendNEC(0x20DFCA35, 32);delay(200); break; case Q.Menu: irsend.sendNEC(0x20DF58A7, 32);delay(200); break; case V--: irsend.sendNEC(0x20DFC03F, 32);delay(200); break; case V++: irsend.sendNEC(0x20DF40BF, 32);delay(200); break; case Ch++: irsend.sendNEC(0x20DF00FF, 32);delay(200); break; case Ch--: irsend.sendNEC(0x20DF807F, 32);delay(200); break; case Return: irsend.sendNEC(0x20DF14EB, 32);delay(200); break; case Settings: irsend.sendNEC(0x20DFC23D, 32);delay(200); break; case MyApps: irsend.sendNEC(0x20DF42BD, 32);delay(200); break; case OK: irsend.sendNEC(0x20DF22DD, 32);delay(200); break; case Up: irsend.sendNEC(0x20DF02FD, 32);delay(200); break; case Down: irsend.sendNEC(0x20DF827D, 32);delay(200); break; case Left: irsend.sendNEC(0x20DFE01F, 32);delay(200); break; case Right: irsend.sendNEC(0x20DF609F, 32);delay(200); break; case Exit: irsend.sendNEC(0x20DFDA25, 32);delay(200); break; } } } if (strstr(s, "IR_LG_")) { s1 = ""; for ( int j=10; j<18; j++){ s1 =s1 + s[j]; switch (s1) { case 1: irsend.sendNEC(0x20DFD02F, 32);delay(200); break; case 2: irsend.sendNEC(0x20DF48B7, 32);delay(200); break; case 3: irsend.sendNEC(0x20DFC837, 32);delay(200); break; case 4: irsend.sendNEC(0x20DF28D7, 32);delay(200); break; case 5: irsend.sendNEC(0x20DFA857, 32);delay(200); break; case 6: irsend.sendNEC(0x20DF6897, 32);delay(200); break; case 7: irsend.sendNEC(0x20DFE817, 32);delay(200); break; case 8: irsend.sendNEC(0x20DF18E7, 32);delay(200); break; case 9: irsend.sendNEC(0x20DF9867, 32);delay(200); break; case 0: irsend.sendNEC(0x20DF08F7, 32);delay(200); break; } } } } Ошибки: Code: IRsendDemo.ino: In function 'void loop()': IRsendDemo:43: error: switch quantity not an integer IRsendDemo:44: error: 'Input' was not declared in this scope IRsendDemo:47: error: 'Mute' was not declared in this scope IRsendDemo:50: error: 'LIST' was not declared in this scope IRsendDemo:53: error: 'Q' was not declared in this scope IRsendDemo:53: error: '.' cannot appear in a constant-expression IRsendDemo:56: error: 'V' was not declared in this scope IRsendDemo:56: error: an decrement cannot appear in a constant-expression IRsendDemo:59: error: an increment cannot appear in a constant-expression IRsendDemo:62: error: 'Ch' was not declared in this scope IRsendDemo:62: error: an increment cannot appear in a constant-expression IRsendDemo:65: error: an decrement cannot appear in a constant-expression IRsendDemo:68: error: 'Return' was not declared in this scope IRsendDemo:71: error: 'Settings' was not declared in this scope IRsendDemo:74: error: 'MyApps' was not declared in this scope IRsendDemo:77: error: 'OK' was not declared in this scope IRsendDemo:80: error: 'Up' was not declared in this scope IRsendDemo:83: error: 'Down' was not declared in this scope IRsendDemo:86: error: 'Left' was not declared in this scope IRsendDemo:89: error: 'Right' was not declared in this scope IRsendDemo:92: error: 'Exit' was not declared in this scope IRsendDemo:103: error: switch quantity not an integer switch quantity not an integer Основная ошибка - error: switch quantity not an integer. Может просто нельзя его использовать для строк в АрдуИДЕ?
Еще вариант сделал: Code: #include <IRremote.h> IRsend irsend; const int ledPin = 13; // the pin that the LED is attached to const int shimPin = 5; long a; int val,b; String s1; void setup() { // initialize serial communication: Serial.begin(9600); // initialize the LED pin as an output: pinMode(ledPin, OUTPUT); pinMode(shimPin, OUTPUT); } void loop() { a = 0; int i=0; char s[8]; memset(&s,0,sizeof(s)); while(Serial.available()>0) { s[i]=Serial.read(); i++; delay(2); } if ((strstr(s, "On_1"))||(strstr(s, "Off_1"))){ if (strstr(s, "On_1")){ digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } } if (strstr(s, "IR_LG_CH_")) { //Пересылка функ.кнопок s1 = ""; for ( int j=10; j<18; j++){ s1 =s1 + s[j]; if (s1 == "Input"){ irsend.sendNEC(0x20DFD02F, 32);delay(200); } if (s1 == "Mute"){ irsend.sendNEC(0x20DF807F, 32);delay(200); } if (s1 == "LIST"){ irsend.sendNEC(0x20DFCA35, 32);delay(200); } if (s1 == "Q.Menu"){ irsend.sendNEC(0x20DF58A7, 32);delay(200); } if (s1 == "V--"){ irsend.sendNEC(0x20DFC03F, 32);delay(200); } if (s1 == "V++"){ irsend.sendNEC(0x20DF40BF, 32);delay(200); } if (s1 == "Ch++"){ irsend.sendNEC(0x20DF00FF, 32);delay(200); } if (s1 == "Ch--"){ irsend.sendNEC(0x20DF807F, 32);delay(200); } if (s1 == "Return"){ irsend.sendNEC(0x20DF14EB, 32);delay(200); } if (s1 == "Settings"){ irsend.sendNEC(0x20DFC23D, 32);delay(200); } if (s1 == "MyApps"){ irsend.sendNEC(0x20DF42BD, 32);delay(200); } if (s1 == "OK"){ irsend.sendNEC(0x20DF22DD, 32);delay(200); } if (s1 == "Up"){ irsend.sendNEC(0x20DF02FD, 32);delay(200); } if (s1 == "Down"){ irsend.sendNEC(0x20DF827D, 32);delay(200); } if (s1 == "Left"){ irsend.sendNEC(0x20DFE01F, 32);delay(200); } if (s1 == "Right"){ irsend.sendNEC(0x20DF609F, 32);delay(200); } if (s1 == "Exit"){ irsend.sendNEC(0x20DFDA25, 32);delay(200); } } } if (strstr(s, "IR_LG_")) { //Пересылаются кнопки Цифр s1 = ""; for ( int j=10; j<11; j++){ String Fuck = Fuck + s[j]; b = Fuck.toInt; switch (b) { case 1: irsend.sendNEC(0x20DFD02F, 32);delay(200); break; case 2: irsend.sendNEC(0x20DF48B7, 32);delay(200); break; case 3: irsend.sendNEC(0x20DFC837, 32);delay(200); break; case 4: irsend.sendNEC(0x20DF28D7, 32);delay(200); break; case 5: irsend.sendNEC(0x20DFA857, 32);delay(200); break; case 6: irsend.sendNEC(0x20DF6897, 32);delay(200); break; case 7: irsend.sendNEC(0x20DFE817, 32);delay(200); break; case 8: irsend.sendNEC(0x20DF18E7, 32);delay(200); break; case 9: irsend.sendNEC(0x20DF9867, 32);delay(200); break; case 0: irsend.sendNEC(0x20DF08F7, 32);delay(200); break; } } } } Опять ошибки, но вообще не там, где я их ожидал... : Code: Изменена опция сборки, пересобираем все IR_NOT_CASE.ino: In function 'void loop()': IR_NOT_CASE:101: error: cannot convert 'String::toInt' from type 'long int (String::)()const' to type 'int' cannot convert 'String::toInt' from type 'long int (String::)()const' to type 'int'
Введите в гугл cannot convert 'String::toInt' from type 'long int (String:()const' to type 'int' и посмотрите результаты =) Как конвертировать строки в числа и прочие дела в различных языках и подязыках - это уже тривиально и смотрится в книжке/онлайн-справочнике по соответствующему языку. Вот пример одного из ответов на одном из форумов на вопрос про такую ошибку:
Думаешь я сначала сюда пишу, а только потом гуглю? Нет, конечно! В гугле мне сказали, что платформа Ардуино очень сильно отличается от стандартов и ответ на свой вопрос я могу найти либо у разрабов, либо из практики(поэтому и написал сюды). Так проблему и не решил. Самое интересное в том, что данный код компилится в АрдуиноИДЕ_1.2.2, а в АрдуиноИДЕ_1.6.5 такие вот ошибки...
Да код жутковат конечно ) 1. В Си нельзя так if(s1 == "string") используй функция для работы со строками strstr или гугл - сравнение строк в Си 2. в switch в case нельзя сравнивать строки см пункт 1 3. s=Serial.read(); i++; - нет проверки на длину буфера ошибка buffer overflow 4. зачем тут String вообще... бррр Как я понимаю идут команды "IR_LG_CH_Mute" "IR_LG_CH_Ok" и прочее - во первых у тебя буфера s (char s[8]) в 8 байт не хватит что бы получить эти команды они больше 8 байт... ну а сравнивать их нужно через strstr Ну лично я бы завел структуру Code: struct IR_LG_CH { char *name; unsinged int nec; } #define CH_COMMANDS 2 IR_LG_CH ch_cmd[CH_COMMANDS]; ch_cmd[0].name="Mute"; ch_cmd[0].nec = 0x20DF807F; ch_cmd[1].name="OK"; ch_cmd[1].nec=0x20DF22DD; if (strstr(s, "IR_LG_CH_")) { for(i=0; i < CH_COMMANDS; i++) { if(strstr(s, ch_cmd[i].name)) { irsend.sendNEC(ch_cmd[i].nec, 32); delay(200); break; } } } что-то типа.
От каких стандартов? Если ты программируешь под avr на Си или Си++, то нужно только соблюдать стандарты языка (и, разумеется, знать этот язык программирования). Ты сейчас пытаешься написать код на C++, не зная этого языка и не имея возможности из-за этого исправить даже самые примитивные ошибки. Ардуино IDE тут не при чем. Ардуино IDE - это просто среда разработки, а компилируется всё в компиляторе g++. Опять-таки, если бы ты знал C++ или C, то ты бы не применял switch для строковых типов. Поэтому сначала предлагаю прочитать несколько статей, где объясняются азы программирования на C++, а потом уже браться за ардуино. PS. Недавно писал под atmega644pa код на C++11 в Atmel Studio, не имел никаких проблем.