Как извлечь нужные числа из serial?

Lexan
Offline
Зарегистрирован: 12.02.2016

Всем привет! Ребята нужна выша помащь. 

Немогу разобратся как вынуть конкретные числа из данных полученых по Serial.

Они находятся в 11, 12, 13,  14, 15 строках. В строках 11, 12, 13 по два числа с плавающей запятой. А в строках 14, 15 по два целых числа.

Строки содержащие ответ начинаются после запроса "> adsl info --show"...

Вот так выглядит запрос и ответ...

Правда ответ не весь там ещё ппродолжение есть но то что находится после 15 строки мне ненужно...

 

 

b707
Offline
Зарегистрирован: 26.05.2017

все достаточно просто - к примеру, ищете строчку, начинающуюся с "SNR (db):" и читаете ее посимвольно , пока не встретите число. Потом "проглатываете" пробелы, пока не встретите другое число.

И так с каждой строкой, которую нужно обработать.

Единственное - это надо делать быстро, чтобы буфер Сериал не переполнился.

Lexan
Offline
Зарегистрирован: 12.02.2016

Получается както так?


String _snr ="";
String _attn ="";
String _pwr ="";
String _max ="";
String _rate ="";
String _dannie ="";

void setup(){

  Serial.begin(115200);
  Serial3.begin(115200); 


}
void loop() {

if (Serial3.available())   {    // Если модем, что-то отправил нам в порт Serial3 ...
 _dannie = Serial3.readString();       //Тут сохроняем данные с порта
if(_dannie.startsWith("SNR(db):")) { //Тут ищем строку которая начинается с "SNR(db):"

       //Блин а тут я уже запутался ))))

}
//Тут ищем строку которая начинается с "Attn(db):"

}
}

Блин чтото я со стрингами совсем не дружу )

b707
Offline
Зарегистрирован: 26.05.2017

Не надо использовать startsWith - у вас прочитанные данные совершенно необязательно начинаются с новой строки. Ищите вхождение "SNR(db):" с помощью IndexOf().

И имейте в виду, что функция readString() имеет не вполне точное название - она вовсе не читает из Сериал одну строку

Lexan
Offline
Зарегистрирован: 12.02.2016

Тогда как мне занести данные полученные из порта в переменную?

Так?

String _dannie = "";
_dannie = Serial3.read();

 

b707
Offline
Зарегистрирован: 26.05.2017
String _dannie = "";
while (Serial3.available())   _dannie =  _dannie + Serial3.read();  

 

Lexan
Offline
Зарегистрирован: 12.02.2016

Тоесть получается пока порт чтото пренимает, переменная _dannie будет какбы накапливать все приходящие новые данные..

Спасибо! Значит начну с этого..

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Lexan пишет:

Тоесть получается пока порт чтото пренимает, переменная _dannie будет какбы накапливать все приходящие новые данные..

Спасибо! Значит начну с этого..

Нет, они ничего не накаплиывет. Напротив, она вычитывает из буфера то, что к настоящему моменту там накопилось. Без всяких гарантий того, что начало будет совпадать с началом строки, а конец - с концом. Т.е. просто то, что успел принять буфер после предыдущего проходя этого программного фрагмента.

Например, за первый проход может быть прочитано "SNR(", а за второй - "db):". Естественно, искомой Вами подстроки не окажется ни в одном из фрагментов.

Lexan
Offline
Зарегистрирован: 12.02.2016

Значит нужно будет обнулить буфер и выйти из цыкла после получения всех необходимых данных я правильно понимаю ??

b707
Offline
Зарегистрирован: 26.05.2017

Lexan пишет:

Значит нужно будет обнулить буфер и выйти из цыкла после получения всех необходимых данных я правильно понимаю ??

не понял вопроса

Lexan
Offline
Зарегистрирован: 12.02.2016

Блин ну типерь я совсем запутался.......

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Lexan, для того, чтобы давать конкретные рекомендации, недостаточно информации. Вы, например, не указали, откуда берутся данные. Можно ли изменить формат их выдачи, какие используются служебные символы и в каком качестве.

Если выдающее денные устройство - Ардуина, желательно показать скетч, который формирует этот вывод. Если какое-то устройство, то к нему должно быть описание выдававемой информации. Если ни того, ни другого нет, я бы перенаправил вывод в файл, а там его внимательно изучил при помощи какого-нибудт HEX-редактора. В первую очередь на вхождение символов 0х09, 0х0A, 0x0D.

Lexan
Offline
Зарегистрирован: 12.02.2016

Ну вроде разобрался смог выдернуть нужные числа в строковом виде String.

Теперь вопрос как проще преобразовать String в float и String в int?

b707
Offline
Зарегистрирован: 26.05.2017

Lexan пишет:

Ну вроде разобрался смог выдернуть нужные числа в строковом виде String.

Теперь вопрос как проще преобразовать String в float и String в int?

зря вы вообще со String связались - пожалеете. Делали бы сразу в char*

Lexan
Offline
Зарегистрирован: 12.02.2016

Покачто парсинг для меня давольно тёмный лес ))

Такчто пока я рад что хоть так получилось...

Для преобразования String to float нужна ли библиотека?

Или можно както стандартными обоитись?

Lexan
Offline
Зарегистрирован: 12.02.2016

"Convert" видимо в C++ не используется я правильно понимаю?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

String.toFloat, String.toInt не годятся чтоли?

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

Penni пишет:
String.toFloat, String.toInt не годятся чтоли?
Не наш метод! Нам бы библиотеку какую скачать!

Lexan
Offline
Зарегистрирован: 12.02.2016

Да нет я бы какраз хотел без лишних библиотек. 

Просто не так давно до String добрался. И покачто такое ещё не проходил... ))

А можно на примере показать?

b707
Offline
Зарегистрирован: 26.05.2017

Lexan пишет:

А можно на примере показать?

привыкайте пользоваться поиском и документацией, а не задавать на форуме элементарные вопросы...

Из официальных доков: https://www.arduino.cc/en/Tutorial/StringToInt