не могу понять как работает функция sscanf
- Войдите на сайт для отправки комментариев
Чт, 28/09/2017 - 13:58
Здравствуйте. Помогите пожалуйста разобраться с функцией sscanf. Я пытаюсь с помощью этой функции распарсить строку "Raint3dNE;Raint-2dS" У меня должны части этой строки оказаться в разных переменных, а именно t1 = "Rain", temperature1 = "3", dir1 = "NE" ,t2 = "Cloud", temperature2 = "-2", dir2 = "S" Прочитал описание данной функции, но всеравно ничего не понял :(
Вы уверены, что Вам нужна именно sscanf? Я. конечно могу показать как ввести Вашу строку, но эта функция чрезвычайно капризна. Она требует точного соответсвия формату. Любой лишний пробел или буква не втом регистре и всё сломается. Уверены? Да, и, кстати, где Вы там Cloud берёте?
аа ,извините немного ввел вас в заблуждение Cloud вместо второго Rain. Raint3dNE;Cloud-2dS Я просто не знаю как по другому распарсить строку такого типа. У меня вообще получается так {тип погоды}t{температура}d{направление ветра}; {тип погоды}t{температура}d{направление ветра} это типо погода утром и вечером. И нужно как то сохранить в переменные эти данные. Но вообще мне нужно как то передать ее на тридня вперед еще я думаю там все это в одну большую строку объеденить и получится чтото вроде: {тип погоды}t{температура}d{направление ветра}; {тип погоды}t{температура}d{направление ветра}n{тип погоды}t{температура}d{направление ветра}; {тип погоды}t{температура}d{направление ветра}m{тип погоды}t{температура}d{направление ветра}; {тип погоды}t{температура}d{направление ветра}
Raint3dNE;Cloud-2dS
У меня вообще получается так {тип погоды}t{температура}d{направление ветра}; {тип погоды}t{температура}d{направление ветра} это типо погода утром и вечером.
Ну, тогда, видим не "Raint3dNE;Cloud-2dS", а "Raint3dNE;Cloudt-2dS"
Кроме того, в "типе погоды" никогда не должна встречаться буква 't' - иначе она всё поломает. Например. тип погоды "буря" (Storm) - недопустим.
А скажите, откуда и куда Вы это передаёте. Т.е. откуда эта строка берётся (кто её передаёт) и кто её принимает. Сдайтся мне, что здесь проще вообще обойтись без передачи строк и без парсинга.
Я на C# написал прогу которая берет данные с сайта погоды парсит их а передает их ардуине через ком-порт. Там их уже ардуина получает и отображает на светодиодных матрицах. аа да не увидел там действительно t должна быть.
Проще и разумнее передавать ардуине уже готовые данные. Например, 1 байт - тип погоды, 2 байт - температура, 3 байт - направление ветра. Потом следующие данные так же и все.
да там поидее этого способа должно хватить , т.к. там ограниченное число возможных символов коорые можно передать. Вообщем я полученные данные с сайта еще и преобразую потом.
Попробовал так сделать
но чето тоже ничего не выводится :(
Потом дебажу что находится в str[0] , но там пусто :(
Памойму, там & нужен, перед переменными, куда пхать. Но могу и ашыбаца.
И не должно выводиться.
Давайте всё-так подумаем, может ну его нафиг - строку передавать. Penni правильно говорит, лучше передавать двоичные данные.
Но если сильно хотите головной боли, могу и sscanf показать, но там всё непросто.
да там поидее этого способа должно хватить , т.к. там ограниченное число возможных символов коорые можно передать.
И чем же там ограничено число возможных символов?
Поймите, вам советуют, как это сделать легче. Поскольку вы передаете данные от одной программы к другой. вам совершенно незачем делать их "human readable" - то есть читабельными. Можно передавать их в виде байтов. Сначала определенная комбинация байт, означающая начало передачи - т.н. "заголовок", уникальная для вашей программы: например 0x07 0xBB 0x65.
Приняв эти три байта, Ардуина будет знать, что дальше последуют погодные данные. Например 0x01 0x02 0x18 0x07 - датчик 1 (0x01), тип погоды 1 (0x01), температура 24.7 градусов (0x18 целых 0x07 десятых гр. С)
Хорошо давайте попробуем передавать побайтово,а это значит что мне получанные данные нужно будет сконвертировать в byte ? А потом их отправить , а как потом их обратно преобразовать ? ну чтобы понять колько градусов было или там направление ветра ?
Хорошо давайте попробуем передавать побайтово,а это значит что мне получанные данные нужно будет сконвертировать в byte ? А потом их отправить , а как потом их обратно преобразовать ? ну чтобы понять колько градусов было или там направление ветра ?
Обратно их преобразовывать не надо, у вас оператор Serial.read() как раз с байтами и работает
Блин, нахрена Вам вообще что-то ковертировать? Чего Вам так неймётся-то?
В каком виде Вы их получаете? Как целые переменные или как что?
да как строки из json запроса. я там получается к вебсервису конекчусь а он мне структуру возвращает с данными строковыми.
Блин, нахрена Вам вообще что-то ковертировать? Чего Вам так неймётся-то?
Евгений. спокойнее :)
Видите, человек вообще не в зуб ногой. чтотакой байты. а что строки... но при этом программу на С# написал...
программу на С#
написал...спиздил дохлую лошадь и притащил сюда
да нет что такое байты и строки я понимаю вроде , каждый символ представляет собой набор байтов, и все :( Только дальше до меня всеравно не доходит , ну я данные вот так получаю
когда считывание прекращается срабатывает другая ветка условия где обрабатывается то что хранится в переменной full
Хмм на шарпе я отправляю данные вот так
а потом получаю в ардуине их вот так
zero это функция которная ноль рисует на матрице, но у меня почемуто не отрабатывает :( Что я не так делаю? аа все понял не увидел , сравнивал byte а там оказывается в int преобразовалось. Хмм интересно.
хоть я и дилетант, но вдруг поможет. Это как предложил b707 в сообщении #9. Сразу предупреждаю что код быдловатый и не проверен.
Две ардуино общаются по Софт сериалу. Для контроля у обоих всё выводится в хард Сериал монитор.
передача параметров погоды осуществляется сообщением размером 10 байт. Первые три - заголовок. Последний - контрольная сумма. Естественно можно увеличить размер сообщения и количество байт.
Скетч передачи
Скетч приема. Ждёт пока получит заголовок и далее парсинг. Если в итоге CRC совпадает, чтонибудь делаем.