Перевод принятого символа с com-порта в число

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

spa-sam пишет:

Один добрый человек подсказал вот такую функцию, очень удобную и простую. За что ему и спасибо!

// Функция парсинга строки
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" ? Почему две переменные? Я не совсем четко представляю себе что делает эта функция. Был бы благодарен за комментарии к каждому действию.

DIYMan пишет:

spa-sam пишет:

Один добрый человек подсказал вот такую функцию

Жесть. Можно сильно проще. Но раз это работает - пущай.

А можно поинтересоваться - как именно? ))) Очень хочу разобраться в происходящем.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Buzzer2010 пишет:

А можно поинтересоваться - как именно? ))) Очень хочу разобраться в происходящем.

С тем же strchr, например. Имея в виду "проще" - я подразумевал понятность и краткость кода, алгоритм там примерно одинаков.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DIYMan пишет:

Buzzer2010 пишет:

А можно поинтересоваться - как именно? ))) Очень хочу разобраться в происходящем.

С тем же strchr, например. Имея в виду "проще" - я подразумевал понятность и краткость кода, алгоритм там примерно одинаков.

Так... Эти все функции, насколько я могу судить - библиотечные? Это я про strchr(), strtok(), atoi()... Наверно там еще какие-то есть? А можете подсказать где можно прочитать про "sscanf()", "sprintf()" и тому подобные? И что это за библиотека?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Buzzer2010 пишет:

 А можете подсказать где можно прочитать про "sscanf()", "sprintf()" и тому подобные? И что это за библиотека?

Обычно делается так: https://www.google.ru/search?q=sscanf&oq=sscanf&aqs=chrome..69i57&sourceid=chrome&ie=UTF-8

Ну и далее по списку ;) Вот тебе ещё интересная ссылка, на предмет почитать: http://cppstudio.com/cat/309/

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DIYMan пишет:

Buzzer2010 пишет:

 А можете подсказать где можно прочитать про "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 нормально отнесется если в скетче ему будут встречаться функции этих хэдеров?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Buzzer2010 пишет:

 Я ж надеюсь всё это применимо к конексту? В смысле - IDE нормально отнесется если в скетче ему будут встречаться функции этих хэдеров?

Всё, что есть в поставке GCC, который идёт в комплекте Arduino IDE - будет понято компилятором. Стандартные библиотеки - точно, при условии, конечно, что есть их порт под МК.

spa-sam
Offline
Зарегистрирован: 14.12.2012

Buzzer2010 пишет:

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]) : "";
}

 

spa-sam
Offline
Зарегистрирован: 14.12.2012

Вот ещё способ неплохой: (ликбез тут - 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);


Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

добавляю и удаляю из скетча кусок ниже - память и динамическая память - НЕ МЕНЯЕТСЯ.

На что влияет 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);