Коллеги подскажите делаю два взаимодействующих по RS232 устройства на базе Arduino Mega и Arduino Uno. В зависимости от внешних факторов одно из них передает в Serial порт текстовое сообщение. Которое надо потом сравнить с имеющимся значением в другом устройстве и отреагировать. Сеть двунаправленная - тоесть оба устройства в ней равнозначны и могут отправлять друг другу сообщения. Пробовал такой вариант но не работает. Чтото не так При компизяции пишет что error: invalid conversion from 'int' to 'const char*' Код (Text): if (Serial1.available()) { int inByte = Serial1.read(); if(!strcmp(inByte,"TEST")) читаю из сериал порта фразы типа TEST Надо сравнить с значением Помогите начинающему )))))) Если не сложно то лучше примером Заранее СПАСИБО !
Естественно. Попытка сравнения числа, представляющего код одного символа со строкой не имеет никакого смысла. Нужно либо читать посимвольно и сравнивать с символами строки, либо считать всю строку и сравнить со строкой. Например, реализация посимвольного ввода: Код (Text): char teststring[5]="TEST"; int i=0; while (i<4){ if (!Serial1.available()) break; int inByte = Serial1.read(); if(inByte!=teststring[i]) break; i++; } if (i==4) { // Действия по строке "TEST" } Если придется сравнивать с несколькими строками-командами, то лучше делать считывание строки и сравнение ее с командой. В этом случае лучше каждую команду начинать с некоторой последовательности символов, обозначающей начало команды, и завершать другой последовательностью, обозначающей завершение команды. Эти последовательности не должны содержать символов, которые могут встретиться в самой команде. Это можно реализовать примерно следующим способом: Код (Text): int readstring(char startsym, char endsym, char* commandbuf, int commandbuflength) { char c=0; byte i=0; //firstsym while (i<commandbuflength) { if (Serial1.available()) { c=Serial1.read(); commandbuf[0]=c; if (commandbuf[0]==startsym) { i++; break; } } } if (i<1) return(0); //to end while ((i<commandbuflength)&&(c!=endsym)) { if (Serial1.available()) { c=Serial1.read(); commandbuf[i]=c; i++; } } return(i); } ..... char teststring[7]="@TEST#"; char readbuf[255]; int L=readstring('@','#',readbuf,254); if (L && (!strcmp(readbuf,teststring))) { ... } ..... В этом случае все команды должны начинаться с символа @, заканчиваться символом # и не должны содержать эти символы. функция readstring считывает данные из порта, пока не встретится символ начала команды и записывает данные в выходной буфер, начиная с этого символа, пока не кончится буфер или не встретится символ конца команды. Дальше можно анализировать строку команды. PS. Код набивал по памяти, возможны опечатки.
Вот спасибо Вам большое !!!! Я к сожалению в програмировании не бум бум - умею только из кусков готового кода собирать ((( Можно последнюю просьбу Собрал загрузочник на базе вашего примера - но что то не компилится - ругается Можете глянуть что то не вижу в чем ошибка Код (Text): void setup() { // initialize both serial ports: Serial.begin(9600); Serial1.begin(9600); } void loop() { int readstring(char startsym, char endsym, char* commandbuf, int commandbuflength) { char c=0; byte i=0; //firstsym while (i<commandbuflength) { if (Serial1.available()) { c=Serial1.read(); commandbuf[0]=c; if (commandbuf[0]==startsym) { i++; break; } } } if (i<1) return(0); //to end while ((i<commandbuflength)&&(c!=endsym)) { if (Serial1.available()) { c=Serial1.read(); commandbuf[i]=c; i++; } } return(i); } char teststring[7]="@TEST#"; char readbuf[255]; int L=readstring('@','#',readbuf,254); if (L && (!strcmp(readbuf,teststring))) { Serial.print("YEAH!!!"); } }
Насколько я помню, в языке С не предусмотрено объявление функции внутри другой функции, а потому функцию readstring нужно вынести за пределы функции loop. Короче говоря строку Код (Text): void loop() { перенести после Код (Text): return(i); }
Кстати об обещанных опечатках. Перед return(i); в функции readstring надо поставить Код (Text): commandbuf[i]=0; А то вызов strcmp не обнаружит в строке readbuf завершающего нуля, и программа будет работать неправильно.
Тоесть так ? Код (Text): void setup() { // initialize both serial ports: Serial.begin(9600); Serial1.begin(9600); } int readstring(char startsym, char endsym, char* commandbuf, int commandbuflength) { char c=0; byte i=0; //firstsym while (i<commandbuflength) { if (Serial1.available()) { c=Serial1.read(); commandbuf[0]=c; if (commandbuf[0]==startsym) { i++; break; } } } if (i<1) return(0); //to end while ((i<commandbuflength)&&(c!=endsym)) { if (Serial1.available()) { c=Serial1.read(); commandbuf[i]=c; i++; } } commandbuf[i]=0; return(i); } void loop() { char teststring[7]="@TEST#"; char readbuf[255]; int L=readstring('@','#',readbuf,254); if (L && (!strcmp(readbuf,teststring))) { Serial.print("YEAH!!!"); } }