fk0, легенда (01.10.2013 12:31, просмотров: 215) ответил sierra на Спасибо за ответ. Т.е. если поступило прерывание, мы функцией в моем случае getMsg, принимаем то, что нам отправили по GPS, из полученной строки берем необходимые данные и все? Тогда на самом деле не должно возникнуть сложностей
Если поступило прерывание: складываем считанные из uart байтики в fifo буфер. Ничего больше. За пределами прерывания считываем из fifo побайтово в массив до обнаружения 0x0d и откидывая 0x0a -- строку текста. Потом проверяем, что строка начинается с '$', и что контрольная сумма в конце совпадает. Если нет -- откидываем строку и всё с начала. Если совпало, то опредляем тип сообщения $GPxxx (strncmp несколько раз) и вызываем соответствующий парсер для каждого типа сообщения. Каждый из которых разбивает строку (strsep) на записи и каждую запись вводит и валидирует (да, входные данные всегда нужно проверять на корректность) отдельно (sscanf, strtod, strcmp и т.п.), некоторые записи могут быть пустые (две запятые подряд), некоторые могут игнорироваться... Результат анализа строки складыватся в структуру. В которой также хранятся признаки принятых типов сообщений (RMC, GGA, GSV и т.п.) и время их принятия (во внутренней системе отсчёта, если нужно относительно точное время...) Если набрался минимально достаточный набор признаков (некоторые данные только в RMC, некоторые только в GGA, без того и другого вместе картина не целостная) -- структуру отдаём на анализ всем интересующимся сторонам и всё с начала. Как отдаём: интересующиеся модули подписываются у GPS-модуля на получение сообщений при их полном разборе (google://"шаблон наблюдатель" и google://"позднее связывание", т.к. GPS-модуль не должен знать о всех интересующихся его сообщениями).
[ZX]