Парсинг

fsdb
Offline
Зарегистрирован: 24.10.2015

Ребята как бы вы разбили эту строчку на float поступающие в COM . дайте пожалуйста пример.

sav_10.00_40.00_0.40_50_-50_175_21.00_2.50_full

 

 
 
wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

$300

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

wdrakula пишет:

$300

$299.99

fsdb
Offline
Зарегистрирован: 24.10.2015

я то сделал, но хотел увидеть пример *нормального* кода. 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

fsdb пишет:

я то сделал, но хотел увидеть пример *нормального* кода. 

$999.99

fsdb
Offline
Зарегистрирован: 24.10.2015

ты еще прошлый перевод не отработал.

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Проще всего использовать стандартную Serial.parseFloat() функцию.

5N62V
Offline
Зарегистрирован: 25.02.2016

fsdb пишет:

я то сделал, но хотел увидеть пример *нормального* кода. 

тю! Сделал, работает - заипис! Нафиг тебе нормальный код? Если хочешь совершенствовать свое мастерство - вывешивай свой код, и тебе быстро объяснят, что курить в первую очередь, а что можно потом.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

fsdb пишет:

я то сделал, но хотел увидеть пример *нормального* кода. 

Над Вами глумятся потому, что Вы не объяснили задачу - не сказали что Вам нужно. Код не бывает нормальным или ненормальным сам по себе - это всегда связано с задачей, которая и диктует критерии нормальности. Понимаете? Вот, например, такой код.

void setup(void){
	Serial.begin(115200);
	char *sInput = (char *) "sav_10.00_40.00_0.40_50_-50_175_21.00_2.50_full";

	for (char *p = strtok(sInput, "sav_"); p; p = strtok(NULL, "full_")) {
		const float f = atof(p);
		Serial.println(f);
	}
}

void loop(void){}

Казалось бы, вполне нормальный. Решает поставленную задачу. Универсальный - не зависит от количества чисел в строке, можно добавить ещё кучу чисел - всё преобразует за милую душу. Но, при некоторых критериях "нормальности" его можно разнести так, что мокрого места не останется. Например, от "срёт" в исходную строку. В каких-то задачах на это наплевать три раза, а в каких-то - это совершенно неприемлемо. Так что без чётко определённых критериев "нормальности" - Ваш вопрос, это просьба нарисовать сферического коня в вакууме. Отсюда и глум.

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

Да простят меня местные "гуру"...)):

https://www.arduino.cc/en/Tutorial/StringSubstring

https://www.arduino.cc/en/Tutorial/StringIndexOf

String message = "sav_10.00_40.00_0.40_50_-50_175_21.00_2.50_full";

void setup() {
Serial.begin(115200);
}

void loop() {
Serial.println(message); 

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);
int Index7 = message.indexOf('_', Index6+1);
int Index8 = message.indexOf('_', Index7+1);
int Index9 = message.indexOf('_', Index8+1);
int Index10 = message.indexOf('_', Index9+1);

String vl_1 = message.substring(0, Index1);
String vl_2 = message.substring(Index1+1, Index2);
String vl_3 = message.substring(Index2+1, Index3);  
String vl_4 = message.substring(Index3+1, Index4); 
String vl_5 = message.substring(Index4+1, Index5); 
String vl_6 = message.substring(Index5+1, Index6); 
String vl_7 = message.substring(Index6+1, Index7); 
String vl_8 = message.substring(Index7+1, Index8);
String vl_9 = message.substring(Index8+1, Index9);
String vl_10 = message.substring(Index9+1, Index10);


Serial.println(vl_1); 
Serial.println(vl_2); 
Serial.println(vl_3); 
Serial.println(vl_4); 
Serial.println(vl_5); 
Serial.println(vl_6); 
Serial.println(vl_7); 
Serial.println(vl_8); 
Serial.println(vl_9);
Serial.println(vl_10);

//strin на float
float vl_prs = vl_2.toFloat();
Serial.print("float   ");
Serial.println(vl_prs);
// и т.д.

}

Код естественно можно упростить, но для понимания пойдёт и так...

P.S. Вместо того чтобы разводить срач можно было бы сделать тему по методам парсинга строки (возможно такая уже есть, не искал). К тому же вопрос был задан вполне понятно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

spa-sam пишет:

P.S. Вместо того чтобы разводить срач можно было бы сделать тему по методам парсинга строки 

Так, делайте. Вам кто-то запрещает? 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

spa-sam пишет:
пойдёт и так...

Ни хера не пойдёт!

ТС ясно просил "нормальный" код, а не говнокодище на 80 строк (если "и.т.д." развернуть), который надо править всякий раз, когда нужно убрать или добавить число во входном потоке. Я уж не  говорю про то, что делают с памятью такая гора нахрен не нужных String'ов.

Nosferatu
Offline
Зарегистрирован: 04.11.2012

ТС не писал нужно ли принимать что-то другое, в другом формате. Если всегда передаются восемь значений в одном и том же порядке, то проще сделать так.

float data[9];
void setup() {
  Serial.begin(9600);
}

void loop() {
  int i = 0;
  while (Serial.available()) {
    data[i] = Serial.parseFloat();
    i++;
  }
}

 

fsdb
Offline
Зарегистрирован: 24.10.2015

Всем спасибо.

ЕвгенийП - отдельное спасибо, я именно такой конструкции  for ниразу не встречал, как и впрочем и strtok вижу впервые...

немогли бы прокоментировать p; - воспринимается компилятором это как? выполнять пока указатель не равен NULL?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, выполнять, пока не 0.