реклама на сайте
подробности

 
 
> sscanf и uint8_t, как правильно?
toweroff
сообщение Oct 19 2015, 12:08
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Добрый день!

есть строка: "3150.7825"

нужно выделить из нее 31, 50 и 7825

есть структура:
Код
typedef __packed struct {
    uint8_t    lat_gr;
    uint8_t    lat_min;
    uint16_t    lat_secs;
} GPS_info_t;

как правильно записать строку форматов?

Пока вот с таким вариантом (там пробел вместо точки, если точка - в hard fault сразу)
Код
sscanf(token_buf, "%02c%02c %hd", &GPS_temp_data.lat_gr, &GPS_temp_data.lat_min, &GPS_temp_data.lat_secs);

считывается просто код символа, т.е.
lat_gr = '3'
lat_min = '5'
lat_secs = '0'

при таком - вываливаемся в hard fault
Код
sscanf(token_buf, "%02d%02d %hd", &GPS_temp_data.lat_gr, &GPS_temp_data.lat_min, &GPS_temp_data.lat_secs);


сканить в int переменные, а потом переприсваивать... некошерно...

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
toweroff
сообщение Oct 19 2015, 14:01
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



CrimsonPig, строки всегда соответствуют паттерну, ибо валятся от GPS приемника

а так оно да, Zltigo прав, sscanf в данном случае - зло, потому как, кроме разбора сообщений GPS, больше нигде не используется
выбросил ее, написал свой atoi, у которого есть еще аргумент кол-во разрядов, почти 2КБ от кода отвалилось

Цитата
не пытался экономить битики и говнокодить

потрудитесь объяснить.
Возможно, у Вас все используемые контроллеры с 1МБ флеша и 128КБ оперативки? У меня все значительно меньше и ужимание кода - это жизненная необходимость
Если у Вас наплевательское отношение к размеру используемых ресурсов, то говнокод - это Ваше творение
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Oct 19 2015, 14:12
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(toweroff @ Oct 19 2015, 15:01) *
CrimsonPig, строки всегда соответствуют паттерну, ибо валятся от GPS приемника

а так оно да, Zltigo прав, sscanf в данном случае - зло, потому как, кроме разбора сообщений GPS, больше нигде не используется
выбросил ее, написал свой atoi, у которого есть еще аргумент кол-во разрядов, почти 2КБ от кода отвалилось
отрудитесь объяснить.
Возможно, у Вас все используемые контроллеры с 1МБ флеша и 128КБ оперативки? У меня все значительно меньше и ужимание кода - это жизненная необходимость
Если у Вас наплевательское отношение к размеру используемых ресурсов, то говнокод - это Ваше творение


Использование стандартных sscanf, printf и попытки съэкономить пару байт (вы считаете себя умнее хорошего оптимизирующего компилятора ?) это глупо. Если при этом еще и портится стек и делаются попытки запрятать проблемы поглубже с помощью манипуляций над пременными, параметрами sscanf и упаковкой структур - это говнокод.
"валятся от GPS приемника" ну-ну.. а каждая посылка от приемника защищена CRC надо полагать ? или оно общатся по последовательному порту без контроля (а даже если из контролем) четности ?
Данные от гпс модуля никогда не теряются и не могут прийти битыми ? (фирмварь для него же такие же кодеры пишут sm.gif
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 19 2015, 14:21
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(CrimsonPig @ Oct 19 2015, 17:12) *
Использование стандартных sscanf, printf и попытки съэкономить пару байт (вы считаете себя умнее хорошего оптимизирующего компилятора ?) это глупо. Если при этом еще и портится стек и делаются попытки запрятать проблемы поглубже с помощью манипуляций над пременными, параметрами sscanf и упаковкой структур - это говнокод.

я говорю про данный конкретный случай
и таки да, printf без поддержки float и отсутствие необходимости в sscanf освободили порядка 5КБ флеша из 32КБ

Цитата(CrimsonPig @ Oct 19 2015, 17:12) *
"валятся от GPS приемника" ну-ну.. а каждая посылка от приемника защищена CRC надо полагать ?

не поверите. NMEA 0183 подразумевает контрольную сумму в конце пакета

Цитата(CrimsonPig @ Oct 19 2015, 17:12) *
или оно общатся по последовательному порту без контроля (а даже если из контролем) четности ?
Данные от гпс модуля никогда не теряются и не могут прийти битыми ? (фирмварь для него же такие же кодеры пишут sm.gif

без контроля четности, GPS модуль располагается на той же плате в 2см от контроллера
Но, возможно, данные потеряются, возможно - придут неверные. Как это "смутит" atoi?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th August 2025 - 16:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016