1. Если по логике после вывода полученных символов надо опять собирать следующие символы с нулевого индекса массива - то да;
2. Нет, не нужно, главное - не забывать про завершающий '\0', и всё. Часто "очистку" статического буфера делают, просто записав в нулевой элемент массива нолик. Это относится к типу char, ессно;
3. Код - кривоват, и иногда может работать не так, как задумано, например, на высоких скоростях UART за 50 миллисекунд внутренний буфер переполнится, и будет потеря данных. Не говоря уже о том, что при записи в массив нет проверки на вхождение индекса записи в диапазон - в С/С++ легко прострелить себе ногу именно таким образом.
3. Код - кривоват, и иногда может работать не так, как задумано, например, на высоких скоростях UART за 50 миллисекунд внутренний буфер переполнится, и будет потеря данных. Не говоря уже о том, что при записи в массив нет проверки на вхождение индекса записи в диапазон - в С/С++ легко прострелить себе ногу именно таким образом.
Логично, надо упростить, спасибо, только надо будет 16 поднять и без условия.
ЗЫ. До оптимизацией готовых скетче обычно не доходит если быстродействия хватает и все работает (
arduino.cc/en/Tutorial/SerialEvent
Значит никакой "ping#" не приходит. И то, что в одинарных кавычках - не строка. Применение такой конструкции может дать любые результаты.
1234# это уже измененный текст
Одинарные кавычки, это символ, символ '#' я нахожу, но дальше сравнени строки не работает.
Изменённый кем? Я вижу, что в строке накапливается "1234#" и делается поиск вхождения подстроки по indexOf('ping#')
Раз в секунду отправляю 1234# и ping#
String inString; void loop() { if (Serial.available()){ softSerial.println("Ok"); delay(5); while (Serial.available()) { char inChar = (char)Serial.read(); inString += inChar; if (inChar == '#') { softSerial.print("Text:"); softSerial.print(inString); softSerial.println(""); if (inString.indexOf("1234#")>0) { softSerial.println("Tcifry"); } else if (inString.indexOf("ping#")>0) { softSerial.println("Soedinenie"); }else{ softSerial.println("Net komandy"); } inString=""; } }//while (Serial.available()) { }//if (Serial.available(){ }Отправляйте "xping#" например. Баг-то на виду - сравните первую посылку и следующие
Раз в секунду отправляю 1234# и ping#
String inString; void loop() { if (Serial.available()){ softSerial.println("Ok"); delay(5); while (Serial.available()) { char inChar = (char)Serial.read(); inString += inChar; if (inChar == '#') { softSerial.print("Text:"); softSerial.print(inString); softSerial.println(""); if (inString.indexOf("1234#")>0) { softSerial.println("Tcifry"); } else if (inString.indexOf("ping#")>0) { softSerial.println("Soedinenie"); }else{ softSerial.println("Net komandy"); } inString=""; } }//while (Serial.available()) { }//if (Serial.available(){ }Если строка inString будет такой: "ping#", то вот это условие - не сработает, т.к. ожидает, что подстрока "ping#" пойдёт со второй позиции:
if (inString.indexOf("1234#")>0)Чуть ниже - такая же засада. Правильная проверка на нахождение подстроки в строке в любой позиции - это:
if (inString.indexOf("1234#") != -1)будет такой: "ping#", то вот это условие - не сработает, т.к. ожидает, что подстрока "ping#" пойдёт со второй позиции:
if (inString.indexOf("1234#")>0)Чуть ниже - такая же засада. Правильная проверка на нахождение подстроки в строке в любой позиции - это:
if (inString.indexOf("1234#") != -1)Так работает. Спасибо.
char buffer[500]; if(sr.available() ){ delay(50); while(sr.available() ){ buffer[i++] = sr.read(); } if(i>0){ buffer[i++]='\0'; Serial.println(buffer); Serial.println(i); i=0;//нужно обнулять переменную i? //нужно ли чистить buffer[i++],как? } }char buffer[500]; if(sr.available() ){ delay(50); while(sr.available() ){ buffer[i++] = sr.read(); } if(i>0){ buffer[i++]='\0'; Serial.println(buffer); Serial.println(i); i=0;//нужно обнулять переменную i? //нужно ли чистить buffer[i++],как? } }1. Если по логике после вывода полученных символов надо опять собирать следующие символы с нулевого индекса массива - то да;
2. Нет, не нужно, главное - не забывать про завершающий '\0', и всё. Часто "очистку" статического буфера делают, просто записав в нулевой элемент массива нолик. Это относится к типу char, ессно;
3. Код - кривоват, и иногда может работать не так, как задумано, например, на высоких скоростях UART за 50 миллисекунд внутренний буфер переполнится, и будет потеря данных. Не говоря уже о том, что при записи в массив нет проверки на вхождение индекса записи в диапазон - в С/С++ легко прострелить себе ногу именно таким образом.
3. Код - кривоват, и иногда может работать не так, как задумано, например, на высоких скоростях UART за 50 миллисекунд внутренний буфер переполнится, и будет потеря данных. Не говоря уже о том, что при записи в массив нет проверки на вхождение индекса записи в диапазон - в С/С++ легко прострелить себе ногу именно таким образом.
Как исправить?
я вот так например буфер построчно заполняю и потом обрабатываю:
void loadDataFromModem() { boolean getData = false; // load data from modem to buf - only one line (string) if (Serial.available()) { while (Serial.available()) { byte br = Serial.read(); if (pos_buf < (max_size_resp_buf - 1)) { // if exist place in response buf resp_buf[pos_buf] = br; ++pos_buf; getData = true; // save input byte in response buf if (br == '\n') if ((pos_buf > 1) && (resp_buf[pos_buf - 2] == '\r')) break; // new string } else { pos_buf = 0; resp_buf[pos_buf] = br; ++pos_buf; getData = true; break; // save input byte in response buf } } } if (getData) resp_buf[pos_buf] = 0; // stop byte of string }в С/С++ легко прострелить себе ногу именно таким образом.
Я всегда так делаю
andycat, а зачем нужна строка #3, если есть #4?
Для надежности.
andycat, а зачем нужна строка #3, если есть #4?
Логично, надо упростить, спасибо, только надо будет 16 поднять и без условия.
ЗЫ. До оптимизацией готовых скетче обычно не доходит если быстродействия хватает и все работает (
Извините, а разве у Serial есть метод readString() ?..
Нигде не могу найти в описании Serial такого метода. Это какой-то другой Serial?
Извините, а вот строчка
charbuffer[100]; - не слишком ли расточительный расход памяти?Постоянно сталкиваюсь с дефицитом памяти в Ардуино UNO и такое расходование памяти показалось мне как-то опрометчивымИзвините, а разве у Serial есть метод readString() ?..
Нигде не могу найти в описании Serial такого метода. Это какой-то другой Serial?
Не там ищите....
https://www.arduino.cc/reference/en/language/functions/communication/ser...
Спасибо