Парсинг Serial дробного числа (с разделительной точкой)

xzsdre

✩✩✩✩✩✩✩
25 Апр 2021
3
0
Приветствую всех участников сообщества!
Прошу подсказать один момент так как самостоятельно не получается додуматься:
Использую "Парсинг Serial раздельный. Вариант 2 (с задержкой)" для парсинга входящих по serial данных. Но нюанс в том, что данные у меня приходят с точкой (например 246.58), и код не обрабатывает данные после точки.
В коде есть пункт, который делает проверку данных, чтобы были только цифры:
if (! isDigit(thisChar)) break;
Если эту строку убираю, то точка (да и вообще любые символы) принимаются не так как должны (другими словами вместо точки рисуется цифры, вместо буквы - тоже цифры). Чувствую что дело в типе переменной, но на какую и как правильно нужно поменять - не могу осилить....

Как вариант, мог бы подойти самый простой код парсера "Принимаем текст из Serial в строку " - он показывает данные корректно, с точкой в том числе, но он не имеет функции парсинга по ключевым буквам в начале строки, и сам я его также пытался туда дописать, но безуспешно....

P.S. Данные в serial идут таким видом:
A_36.65
B_68.96
C_68.95

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

Заранее благодарен за помощь!
 

poty

★★★★★★✩
19 Фев 2020
3,238
943
Тогда Вам нужно применять пример Примем-ка два float числа, в качестве разделителя использовать перевод строки. Первые 2 символа просто убрать - надо взять в качестве начала строки адрес третьего символа, dividerIndex тоже не нужно высчитывать, это будет длина строки:
C++:
String buf_1 = bufString.substring(2);    // создаём строку с первым числом
Соответственно, все остальные строки будут приниматься в цикле loop() одна за другой.
 

xzsdre

✩✩✩✩✩✩✩
25 Апр 2021
3
0
Ваша подсказка понятна, спасибо! Но желательно бы оставить какие-то маркеры значений, чтобы им точно назначить соответствующие переменные.
Например значение A_456.36 идёт в переменную "number1", значение B_378.35 идёт в переменную "number2", значение C_956.85 идёт в переменную "number3".

Добавлю информации: данные в serial идут циклически, одно за другим:

A_125.65
B_658.74
C_659.96
A_128.63
B_694.63
C_693.58

и так далее.
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
Вам нужны сотые? - умножьте приходящие числа на 100 перед передачей и принимайте как целые. А потом поделите обратно на 100
 

poty

★★★★★★✩
19 Фев 2020
3,238
943

@xzsdre,
Так а в чём проблема? Используйте во входной строке символ номер 0 - он будет индикатором того, в какую переменную поместить распарсеное число. Тот же switch, например, хоть и не люблю я его. Можно и даже нужно использовать оптимизацию, которую подсказал
@bort707, если есть возможность сделать что-то на передающей стороне и числа передаются по формату, а не по количеству значащих цифр. Иначе овчинка может не стоить выделки.