Cпасибо. А если не секрет: зачем нужны "xvalue" и "yvalue" ? Почему две переменные? Я не совсем четко представляю себе что делает эта функция. Был бы благодарен за комментарии к каждому действию.
DIYMan пишет:
spa-sam пишет:
Один добрый человек подсказал вот такую функцию
Жесть. Можно сильно проще. Но раз это работает - пущай.
А можно поинтересоваться - как именно? ))) Очень хочу разобраться в происходящем.
А можно поинтересоваться - как именно? ))) Очень хочу разобраться в происходящем.
С тем же strchr, например. Имея в виду "проще" - я подразумевал понятность и краткость кода, алгоритм там примерно одинаков.
Так... Эти все функции, насколько я могу судить - библиотечные? Это я про strchr(), strtok(), atoi()... Наверно там еще какие-то есть? А можете подсказать где можно прочитать про "sscanf()", "sprintf()" и тому подобные? И что это за библиотека?
Вах! Какие хорошие ссылки. Не ну погуглить - это я конечно, полентяйничал. А вот ссылка со списком хэдеров - очень полезная. Я ж надеюсь всё это применимо к конексту? В смысле - IDE нормально отнесется если в скетче ему будут встречаться функции этих хэдеров?
Я ж надеюсь всё это применимо к конексту? В смысле - IDE нормально отнесется если в скетче ему будут встречаться функции этих хэдеров?
Всё, что есть в поставке GCC, который идёт в комплекте Arduino IDE - будет понято компилятором. Стандартные библиотеки - точно, при условии, конечно, что есть их порт под МК.
Cпасибо. А если не секрет: зачем нужны "xvalue" и "yvalue" ? Почему две переменные? Я не совсем четко представляю себе что делает эта функция. Был бы благодарен за комментарии к каждому действию.
String val = "12.34;nod;54;-23.7;hello"; // наша строка на парсинг
void setup() {
Serial.begin(9600);
}
void loop() {
String data_1 = getValue(val,';',0 ); //присваиваем переменной первый набор символов разделённые ";" т.е 12.34
String data_2 = getValue(val, ';', 1); //присваиваем переменной второй набор символов разделённые ";" т.е nod
String data_3 = getValue(val, ';', 2); //присваиваем переменной второй набор символов разделённые ";" т.е 54
String data_4 = getValue(val, ';', 3); //присваиваем переменной второй набор символов разделённые ";" т.е -23.7
String data_5 = getValue(val, ';', 4); //присваиваем переменной второй набор символов разделённые ";" т.е hello
//вместо ";" может быть любой символ -разделитель
//выводим в компорт всё, что напарсили
Serial.println("data_1: " + data_1);
Serial.println("data_2: " + data_2);
Serial.println("data_3: " + data_3);
Serial.println("data_4: " + data_4);
Serial.println("data_5: " + data_5);
Serial.println();
Serial.println();
delay (2000);
float var =data_1.toFloat() + data_3.toFloat(); //конвертируем string во float и суммируем
//выводим результат сложения
Serial.print ("data_1 + data_3 = ");
Serial.println( var);
Serial.println();
Serial.println();
delay (2000);
}
// Функция парсинга строки, которая вызывается в loop
String getValue(String data, char separator, int index)
{
int found = 0;
int strIndex[] = {0, -1 };
int maxIndex = data.length()-1;
for(int i=0; i<=maxIndex && found<=index; i++){
if(data.charAt(i)==separator || i==maxIndex){ found++;
strIndex[0] = strIndex[1]+1;
strIndex[1] = (i == maxIndex) ? i+1 : i;}
}
return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}
добавляю и удаляю из скетча кусок ниже - память и динамическая память - НЕ МЕНЯЕТСЯ.
На что влияет String ? только на скорость выполнения программы или все же память где то сильно кушает?
int Index1 = val.indexOf(','); //разделительный символ
int Index2 = val.indexOf(',', Index1+1); //вычисляем второй символ
int Index3 = val.indexOf(',', Index2+1); //...третий и т.д.
int Index4 = val.indexOf(',', Index3+1);
int Index5 = val.indexOf(',', Index4+1);
String Val_1 = val.substring(0, Index1);//что-то перед первым разд. сим.
String Val_2 = val.substring(Index1+1, Index2);//что-то за первым разд. сим.
String Val_3 = val.substring(Index2+1, Index3);//за вторым и т.д
String Val_4 = val.substring(Index3+1, Index4);
String Val_5 = val.substring(Index4+1, Index5);
Один добрый человек подсказал вот такую функцию, очень удобную и простую. За что ему и спасибо!
// Функция парсинга строки String getValue(String data, char separator, int index) { int found = 0; int strIndex[] = {0, -1 }; int maxIndex = data.length()-1; for(int i=0; i<=maxIndex && found<=index; i++){ if(data.charAt(i)==separator || i==maxIndex){ found++; strIndex[0] = strIndex[1]+1; strIndex[1] = (i == maxIndex) ? i+1 : i;} } return found>index ? data.substring(strIndex[0], strIndex[1]) : ""; }String xval = getValue(myString, ':', 0); String yval = getValue(myString, ':', 1); Serial.println("Y:" + yval); Serial.print("X:" + xval); int xvalue = stringToNumber(xval); int yvalue = stringToNumber(yval);Cпасибо. А если не секрет: зачем нужны "xvalue" и "yvalue" ? Почему две переменные? Я не совсем четко представляю себе что делает эта функция. Был бы благодарен за комментарии к каждому действию.
Один добрый человек подсказал вот такую функцию
Жесть. Можно сильно проще. Но раз это работает - пущай.
А можно поинтересоваться - как именно? ))) Очень хочу разобраться в происходящем.
А можно поинтересоваться - как именно? ))) Очень хочу разобраться в происходящем.
С тем же strchr, например. Имея в виду "проще" - я подразумевал понятность и краткость кода, алгоритм там примерно одинаков.
А можно поинтересоваться - как именно? ))) Очень хочу разобраться в происходящем.
С тем же strchr, например. Имея в виду "проще" - я подразумевал понятность и краткость кода, алгоритм там примерно одинаков.
А можете подсказать где можно прочитать про "sscanf()", "sprintf()" и тому подобные? И что это за библиотека?
Обычно делается так: https://www.google.ru/search?q=sscanf&oq=sscanf&aqs=chrome..69i57&sourceid=chrome&ie=UTF-8
Ну и далее по списку ;) Вот тебе ещё интересная ссылка, на предмет почитать: http://cppstudio.com/cat/309/
А можете подсказать где можно прочитать про "sscanf()", "sprintf()" и тому подобные? И что это за библиотека?
Обычно делается так: https://www.google.ru/search?q=sscanf&oq=sscanf&aqs=chrome..69i57&sourceid=chrome&ie=UTF-8
Ну и далее по списку ;) Вот тебе ещё интересная ссылка, на предмет почитать: http://cppstudio.com/cat/309/
Я ж надеюсь всё это применимо к конексту? В смысле - IDE нормально отнесется если в скетче ему будут встречаться функции этих хэдеров?
Всё, что есть в поставке GCC, который идёт в комплекте Arduino IDE - будет понято компилятором. Стандартные библиотеки - точно, при условии, конечно, что есть их порт под МК.
Cпасибо. А если не секрет: зачем нужны "xvalue" и "yvalue" ? Почему две переменные? Я не совсем четко представляю себе что делает эта функция. Был бы благодарен за комментарии к каждому действию.
String val = "12.34;nod;54;-23.7;hello"; // наша строка на парсинг void setup() { Serial.begin(9600); } void loop() { String data_1 = getValue(val,';',0 ); //присваиваем переменной первый набор символов разделённые ";" т.е 12.34 String data_2 = getValue(val, ';', 1); //присваиваем переменной второй набор символов разделённые ";" т.е nod String data_3 = getValue(val, ';', 2); //присваиваем переменной второй набор символов разделённые ";" т.е 54 String data_4 = getValue(val, ';', 3); //присваиваем переменной второй набор символов разделённые ";" т.е -23.7 String data_5 = getValue(val, ';', 4); //присваиваем переменной второй набор символов разделённые ";" т.е hello //вместо ";" может быть любой символ -разделитель //выводим в компорт всё, что напарсили Serial.println("data_1: " + data_1); Serial.println("data_2: " + data_2); Serial.println("data_3: " + data_3); Serial.println("data_4: " + data_4); Serial.println("data_5: " + data_5); Serial.println(); Serial.println(); delay (2000); float var =data_1.toFloat() + data_3.toFloat(); //конвертируем string во float и суммируем //выводим результат сложения Serial.print ("data_1 + data_3 = "); Serial.println( var); Serial.println(); Serial.println(); delay (2000); } // Функция парсинга строки, которая вызывается в loop String getValue(String data, char separator, int index) { int found = 0; int strIndex[] = {0, -1 }; int maxIndex = data.length()-1; for(int i=0; i<=maxIndex && found<=index; i++){ if(data.charAt(i)==separator || i==maxIndex){ found++; strIndex[0] = strIndex[1]+1; strIndex[1] = (i == maxIndex) ? i+1 : i;} } return found>index ? data.substring(strIndex[0], strIndex[1]) : ""; }Вот ещё способ неплохой: (ликбез тут - https://www.arduino.cc/en/Tutorial/StringSubstring)
String message = "data1;data2;data3;data4;data5;data6"; int Index1 = message.indexOf(';'); //разделительный символ int Index2 = message.indexOf(';', Index1+1); //вычисляем второй символ int Index3 = message.indexOf(';', Index2+1); //...третий и т.д. int Index4 = message.indexOf(';', Index3+1); int Index5 = message.indexOf(';', Index4+1); int Index6 = message.indexOf(';', Index5+1); String Val_1 = message.substring(0, Index1);//что-то перед первым разд. сим. String Val_2 = message.substring(Index1+1, Index2);//что-то за первым разд. сим. String Val_3 = message.substring(Index2+1, Index3);//за вторым и т.д String Val_4 = message.substring(Index3+1, Index4); String Val_5= message.substring(Index4+1, Index5); String Val_6 = message.substring(Index5+1, Index6); Serial.println(Val_1); Serial.println(Val_2); Serial.println(Val_3); Serial.println(Val_4); Serial.println(Val_5); Serial.println(Val_6);добавляю и удаляю из скетча кусок ниже - память и динамическая память - НЕ МЕНЯЕТСЯ.
На что влияет String ? только на скорость выполнения программы или все же память где то сильно кушает?
int Index1 = val.indexOf(','); //разделительный символ int Index2 = val.indexOf(',', Index1+1); //вычисляем второй символ int Index3 = val.indexOf(',', Index2+1); //...третий и т.д. int Index4 = val.indexOf(',', Index3+1); int Index5 = val.indexOf(',', Index4+1); String Val_1 = val.substring(0, Index1);//что-то перед первым разд. сим. String Val_2 = val.substring(Index1+1, Index2);//что-то за первым разд. сим. String Val_3 = val.substring(Index2+1, Index3);//за вторым и т.д String Val_4 = val.substring(Index3+1, Index4); String Val_5 = val.substring(Index4+1, Index5);