С разборкой формата NMEA проблем нет -- там обычные текстовые строки, начинающиеся с '$'.
Но приёмник выдаёт данные в формате BINR, а там запись имеет следующую структуру:
0x10, <тип> <данные ... > 0x10, 0x03
Если в данных встречается байт 0x10, то он удваивается. Поэтому я решил просто, найдя заголовок, записывать данные в буфер, а после обнаружения конца записи его разбирать.
И тут возникла проблема. В Документе описана структура данных. Основная информация берётся из записи с типом 0x88 -- вектор состояния. Эта запись имеет длину 69 байтов и содержит значения типов: FP64, FP32, INT16S, INT8U и FP80. Аналогом первых четырёх типов в языке C являются double, float, а также (через ыевштеюр) int16_t и uint8_t.
А вот с FP80 я не могу найти аналога. В языке Pascal это extended. По-моему, в виндовых компиляторах long double занимал 10 байтов. Но в gcc это 12 или даже 16 байтов. Хотя значащих только 10 (в x86).
Пока я это это сделал следующим способом:
Код: Выделить всё
long double week_time=0; // чтобы все байты переменой были нулевыми
memcpy(&week_time,buf+28,10); // с 28 до 38 байта находится время с начала недели, мс
P.S. Когда я анализировал принимаемые данные (было запрошено передавать их через 5 секунд), значение week_time менялось с шагом 5000. Причём, целая часто всегда была кратна 1000. Но вот дробная часть не была нулевой.
P.P.S. На счёт кратности 1000 я ошибся.
Сейчас проанализировал ещё один массив данных (почти за 11 минут, с шагом 1 секунда).
начальное значение времени было 399910999.753134 мс, конечное -- 399910999.753134 мс