Парсинг
- Войдите на сайт для отправки комментариев
Сб, 07/10/2017 - 23:45
Ребята как бы вы разбили эту строчку на float поступающие в COM . дайте пожалуйста пример.
sav_10.00_40.00_0.40_50_-50_175_21.00_2.50_full
Ребята как бы вы разбили эту строчку на float поступающие в COM . дайте пожалуйста пример.
sav_10.00_40.00_0.40_50_-50_175_21.00_2.50_full
$300
$300
$299.99
я то сделал, но хотел увидеть пример *нормального* кода.
я то сделал, но хотел увидеть пример *нормального* кода.
$999.99
ты еще прошлый перевод не отработал.
Проще всего использовать стандартную Serial.parseFloat() функцию.
я то сделал, но хотел увидеть пример *нормального* кода.
я то сделал, но хотел увидеть пример *нормального* кода.
Над Вами глумятся потому, что Вы не объяснили задачу - не сказали что Вам нужно. Код не бывает нормальным или ненормальным сам по себе - это всегда связано с задачей, которая и диктует критерии нормальности. Понимаете? Вот, например, такой код.
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){}Казалось бы, вполне нормальный. Решает поставленную задачу. Универсальный - не зависит от количества чисел в строке, можно добавить ещё кучу чисел - всё преобразует за милую душу. Но, при некоторых критериях "нормальности" его можно разнести так, что мокрого места не останется. Например, от "срёт" в исходную строку. В каких-то задачах на это наплевать три раза, а в каких-то - это совершенно неприемлемо. Так что без чётко определённых критериев "нормальности" - Ваш вопрос, это просьба нарисовать сферического коня в вакууме. Отсюда и глум.
Да простят меня местные "гуру"...)):
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. Вместо того чтобы разводить срач можно было бы сделать тему по методам парсинга строки (возможно такая уже есть, не искал). К тому же вопрос был задан вполне понятно.
P.S. Вместо того чтобы разводить срач можно было бы сделать тему по методам парсинга строки
Так, делайте. Вам кто-то запрещает?
Ни хера не пойдёт!
ТС ясно просил "нормальный" код, а не говнокодище на 80 строк (если "и.т.д." развернуть), который надо править всякий раз, когда нужно убрать или добавить число во входном потоке. Я уж не говорю про то, что делают с памятью такая гора нахрен не нужных String'ов.
ТС не писал нужно ли принимать что-то другое, в другом формате. Если всегда передаются восемь значений в одном и том же порядке, то проще сделать так.
float data[9]; void setup() { Serial.begin(9600); } void loop() { int i = 0; while (Serial.available()) { data[i] = Serial.parseFloat(); i++; } }Всем спасибо.
ЕвгенийП - отдельное спасибо, я именно такой конструкции for ниразу не встречал, как и впрочем и strtok вижу впервые...
немогли бы прокоментировать p; - воспринимается компилятором это как? выполнять пока указатель не равен NULL?
Да, выполнять, пока не 0.