GPS- и ГЛОНАСС-приёмники выдают данные текстом по стандарту NMEA 0183: каждое сообщение — строка, которая начинается с $, содержит поля через запятую и заканчивается звёздочкой с контрольной суммой. Модули u-blox NEO-6M и NEO-M8N по умолчанию шлют в UART на 9600 бит/с сообщения GGA, GLL, GSA, GSV, RMC, VTG и TXT раз в секунду (даташиты NEO-6 и NEO-M8), и их можно прочитать прямо в мониторе порта. Инструмент раскладывает их по полям.
Устройство строки
| Часть | Пример | Что значит |
|---|---|---|
| Начало | $ | начало сообщения |
| Адрес | GPGGA | Talker ID (GP) и тип сообщения (GGA); у собственных сообщений производителя — P и его код, у u-blox PUBX |
| Поля | 092725.00,4717.11399,N,… | данные через запятую; пустое поле — значение неизвестно |
| Контрольная сумма | *5B | XOR всех символов между $ и *, две шестнадцатеричные цифры |
| Конец | <CR><LF> | возврат каретки и перевод строки |
Приёмники u-blox 6 (в том числе NEO-6M) работают по версии NMEA 2.3, u-blox M8 — по версии 4.10, в которой у RMC добавилось поле навигационного статуса, у GSA — номер системы, у GSV — номер сигнала. Инструмент разбирает обе версии.
Основные сообщения
| Сообщение | Что передаёт |
|---|---|
| GGA | время, координаты, качество решения, число спутников, HDOP, высоту над уровнем моря |
| RMC | «рекомендуемый минимум»: время, статус, координаты, скорость в узлах, курс, дату |
| GLL | координаты и время |
| GSA | режим 2D/3D, номера спутников в решении, PDOP, HDOP, VDOP |
| GSV | видимые спутники: номер, возвышение, азимут, отношение сигнал/шум — по четыре в сообщении |
| VTG | курс и скорость в узлах и км/ч |
| ZDA | время и дата |
Признаки достоверности в u-blox такие: в RMC и GLL статус A — данные достоверны, V — нет; в GGA качество 0 — нет решения, 1 — автономное, 2 — дифференциальное, 6 — счисление. Скорость в RMC и VTG — в узлах: 1 узел — ровно 1,852 км/ч.
Коротко
- Контрольная сумма — XOR кодов ASCII всех символов между
$и*. - Координаты — градусы и минуты: широта ггмм.мммм, долгота гггмм.мммм; градусы = гг + мм.мммм / 60.
- Talker ID: GP — GPS, GL — ГЛОНАСС, GA — Galileo, GB — BeiDou, GN — несколько систем.
Как пользоваться
- Подключите модуль к компьютеру через USB-UART или выведите строки из микроконтроллера в монитор порта, скопируйте несколько строк и вставьте их в поле.
- Каждое сообщение раскладывается в таблицу: поле, сырое значение и расшифровка — время, статус, качество, скорость в км/ч, дата. Неверная контрольная сумма подсвечивается вместе с правильной.
- Чтобы отправить приёмнику команду — например, собственное сообщение u-blox
PUBX,40для включения или выключения отдельных сообщений на портах, — переключитесь в режим расчёта контрольной суммы и скопируйте готовую строку.
Даже в описаниях протокола встречаются опечатки: в примерах описания u-blox M8 у нескольких строк контрольная сумма не сходится — например, у RMC, в которую добавили поле версии 4.10, оставлена сумма *57 из примера u-blox 6, а правильная — *2D. Проверять свои строки лучше расчётом.
Частые вопросы
Как посчитать контрольную сумму NMEA?
Возьмите все символы между $ и * и выполните над их кодами ASCII исключающее ИЛИ (XOR) по очереди. Результат записывают двумя шестнадцатеричными цифрами после звёздочки. Для строки $GPGLL,,,,,,V,N она равна 0x64, и строка целиком — $GPGLL,,,,,,V,N*64. Знаки $ и * в расчёт не входят, как и перевод строки в конце.
Как перевести координаты из NMEA в градусы?
NMEA передаёт широту как ггмм.мммм, а долготу как гггмм.мммм — градусы и минуты с дробью. Отделите градусы и прибавьте к ним минуты, делённые на 60: широта 4717.112671 N — это 47 + 17,112671 / 60 = 47,28521118°, долгота 00833.914843 E — 8,56524738°. Для южной широты и западной долготы знак минус.
Чем GPGGA отличается от GNGGA?
Первые две буквы после $ — идентификатор источника (Talker ID). GP — решение по GPS (у u-blox вместе с SBAS и QZSS), GL — ГЛОНАСС, GA — Galileo, GB — BeiDou, GN — решение по нескольким системам сразу. Поля сообщения одинаковы; приёмник с ГЛОНАСС и GPS, например NEO-M8N в настройках по умолчанию, выдаёт GNGGA и GNRMC.
Почему в строке нет координат, а поля пустые?
Приёмник ещё не нашёл решение: после включения без данных о спутниках поиск занимает десятки секунд — у NEO-6M по даташиту около 27 с при хорошем сигнале. Пока решения нет, u-blox выводит пустые поля и признак недостоверности: в RMC и GLL статус V, в GGA качество 0. Под крышей и в помещении время поиска растёт или решение не находится вовсе.
Источники
- u-blox. u-blox 6 Receiver Description including Protocol Specification (GPS.G6-SW-10018-F) — разд. 16–20: NMEA 0183 версии 2.3, формат широты и долготы, флаги решения, сообщения GGA, GLL, GSA, GSV, RMC, VTG, ZDA, PUBX с примерами — эталон тестов
- u-blox. u-blox 8 / u-blox M8 Receiver Description including Protocol Specification (UBX-13003221), R28 — разд. 31: NMEA 4.10, Talker ID (GP, GL, GA, GB, GN), флаги решения и режимы, поля RMC с navStatus, GSV с signalId — второй источник примеров
- u-blox. NEO-6 u-blox 6 GPS Modules Data Sheet (GPS.G6-HW-09005-E) — разд. 1.3: время первого решения NEO-6M (холодный старт 27 с); настройки по умолчанию: NMEA, 9600 бит/с
- u-blox. NEO-M8 Data Sheet (UBX-15031086), R14, 2025 — разд. 8: UART 9600 бит/с 8N1, сообщения GGA, GLL, GSA, GSV, RMC, VTG, TXT при включении; табл. 1 — приём GPS и ГЛОНАСС по умолчанию
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/nmea/" title="Разбор строк NMEA и контрольная сумма" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/nmea/">Разбор строк NMEA и контрольная сумма</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено .
Нашли ошибку в расчёте?