Июн 172013
 

NMEA 0183 – текстовый протокол связи, используемый в приемных модулях GPS. Этот стандарт был создан для связи морского навигационного оборудования. Протоколом предусмотрена передача текстовых команд и сообщений посредством ASCII символов. Таким образом, для приема сообщений достаточно использовать последовательный интерфейс UART, при этом все сообщения можно передавать непосредственно на компьютер, используя для этого COM-порт, но не забывая о необходимости преобразования уровней сигналов.

Модуль GPS передает сообщения разного формата, содержащие различный набор данных: широта и долгота, скорость, курс, время, количество спутников и т.д. Сообщения передаются последовательно и делятся на несколько видов, формат каждого вида сообщений содержит в своих полях строго определенную информацию. Рассмотрим подробней общую структуру сообщений, которые выдает модуль GPS.

$ — с этого символа начинается каждое сообщение

Далее следует идентификатор из 5 текстовых символов. Первые две буквы обозначают тип навигационной системы, например «GP» — GPS или «GL» — Глонасс и т.д. Следующие 3 символа – это идентификатор формата сообщения, который полностью определяет содержимое последующих переданных данных. Например «RMC» — это рекомендованный минимум данных, в котором содержится информация о времени и дате, широте и долготе, скорости, курсе и магнитном отклонении в градусах (может отсутствовать). Или «GSA», здесь будут переданы данные о спутниках. Структура основных типов сообщений будет рассмотрена ниже.

Затем следует «,» — запятая, после которой уже непосредственно идет тело сообщения с различными данными, которые отделяются друг от друга такой же запятой. Если передаваемое число не целое, то разделителем между целой и дробной частями служит точка «.».

Конец тела сообщения обозначается символом «*». Далее следует контрольная сумма всех символов, содержащихся между «$» и «*», то есть всего тела сообщения, включая и сами данные и идентификаторы в начале сообщения. Контрольная сумма вычисляется как XOR (исключающее ИЛИ) всех шестнадцатеричных кодов ASCII символов сообщения.

И в самом конце каждого сообщения обязательно следуют символы перевода строки <CR><LF>

Рассмотрим назначение и структуру различных типов сообщений.

RMC – рекомендованный минимум навигационных данных. Сообщение содержит минимально необходимое количество информации. Это данные о широте и долготе, дате и времени, скорости. Для многих задач большего и не надо, например, в модуле Quectel L50 я отключил передачу всех других типов сообщений, поскольку информация о спутниках и уровне их сигналов мне абсолютно не нужна. А прием излишней информации требует усложнения программы обработки этих данных. Структура сообщения такая:

$GPRMC, hhmmss.sss,A, ddmm.mmmm,N,ddmm.mmmm ,E,v.v,c.c, ddmmyyyy,x.x,n,m*hh<CR><LF>

Это сообщение содержит следующие данные:

  • GPRMC – спутниковая система GPS, идентификатор сообщения RMC
  • hhmmss.sss – время (по Гринвичу), где hh – часы, mm – минуты, ss.sss – секунды
  • A – данные достоверны или V – данные недостоверны. Символ A в сообщении будет при уверенном приеме сигналов со спутников, необходимом для вычисления данных о местоположении. Символ V будет, когда приемник не увидит спутников или когда количество найденных спутников недостаточно для уверенного расчета координат. Например, если вы включите модуль GPS где-то панельном доме и на удалении от окон, скорее всего вы увидите символ V в принятом сообщении.
  • ddmm.mmmm – широта, градусы и минуты
  • N или S – север или юг. Полушарие, в котором вы находитесь. Если вы находитесь в Австралии, то покажет S. У меня в Екатеринбурге модуль GPS выдает N.
  • ddmm.mmmm – долгота, градусы и минуты
  • E или W – западное или восточное полушарие
  • v.v – скорость в узлах
  • c.c – курс над землей в градусах. При движении строго на север будет 0 градусов.
  • ddmmyyyy – дата
  • x.x – магнитное склонение
  • n – направление магнитного склонения. По этим двум последним параметрам ничего разъяснить не смогу. Например, мой модуль GPS Quectel L50 при приеме в квартире на окне эти данные не показывал вовсе, просто пропускал.
  • m – режим навигации: N – недостоверные данные, A – автономный, D – дифференциальный

Вот пример сообщения RMC:

$GPRMC,105954.000,A,3150.6731,N,11711.9399,E,0.00,96.10,250313,,,A*53

  • Время по Гринвичу 10ч 59м 54сек
  • A – данные достоверны
  • Широта 31 градус и 50.6371 минут
  • N – северная
  • Долгота 117 градусов 11.9399 минут
  • E – восточная
  • Скорость 0.00 узлов
  • Курс 96.1 градусов
  • Дата 25 марта 2013 года
  • Данные о магнитном склонении отсутствуют
  • Режим – автономный
  • Контрольная сумма символов сообщения 0x053

Здесь необходимо отметить один нюанс. Данные о широте и долготе содержат дробную часть минут, которая вовсе не соответствует количеству «секунд», поскольку является десятичной дробью. Те программы для работы с GPS, которые я пробовал, показывают координаты на карте точно. Но если ввести эти числа в строку поиска Google maps, то местоположение на карте получится в нескольких километрах от действительного. При вводе полученных координат в этом случае необходимо поделить дробную часть широты и долготы на 60, чтобы перевести эти числа в «секунды». При первом подключении модуля Quectel L50 и вводе полученных координат широты и долготы в строку поиска Google maps, я получил положение на карте со значительной погрешностью, на карте обозначилось место где-то в районе Уралмаша.

Вот еще некоторые типы сообщений, используемые в данном протоколе:

  • VTG — истинное направление курса и скорость относительно земли
  • GGA — данные о последнем определении местоположения
  • GSA — данные об активных спутниках
  • GSV — данные о видимых спутниках, их положении и номерах, а также уровне сигнала
  • GLL — данные о широте, долготе и времени
  • ZDA — данные о времени и дате

Я не стал подробно разбирать из чего состоит каждое сообщение, ссылка на документ с описанием протокола приведена в конце статьи. Конкретный тип GPS модуля может передавать не все данные из приведенных. Можно отключить или включить передачу различных типов данных, а также настроить период их выдачи. Для настройки модуля существуют специальные команды, которые начинаются с идентификатора $PSRFxxx, где xxx определяет тип и формат команды, точно так же как в исходящих сообщениях.

Например, команда $PSRF100,0,9600,8,1,0*0C<CR><LF> задает протокол обмена и настраивает параметры последовательного порта.

  • $PSRF100 – идентификатор команды собственного протокола SIRF
  • 0 – бинарный протокол SIRF, 1 – протокол NMEA
  • 9600 – скорость бит/сек
  • 8 бит данных
  • 1 стоп-бит
  • 0 – проверка на четность отключена

Команда $PSRF103,00,00,02,01*26<CR><LF> настраивает параметры вывода различных типов сообщений модуля:

  • $PSRF103 – идентификатор команды собственного протокола SIRF
  • далее после запятой идут две цифры, которые определяют тип настраиваемого сообщения:00 — GGA
    01 — GLL
    02 — GSA
    03 — GSV
    04 — RMC
    05 — VTG
  • следующие две цифры настраивают порядок выдачи сообщений, например:00 — периодически
    01 — по запросу
  • следующие цифры задают период выдачи сообщений в секундах:00 = Off (сообщения отключены)
    1-255 – интервал между сообщениями данного типа в секундах
  • далее включается/отключается передача контрольной суммы в сообщении NMEA, передаваемом модулем:00 – передача контрольной суммы отключена
    01 – контрольная сумма передается
  • после символа “*”, как и в исходящем сообщении NMEA, передаются контрольная сумма и символы перевода строки.

Вот и все, что хотелось вкратце изложить о протоколе NMEA 0183 и командах управления модулем на чипсете SIRF. Более подробно расшифровка всех этих сообщений и команд приведена, например, в описании протокола модуля Quectel L50, который можно загрузить по ссылке ниже.

L50 GPS Protocol Specification

Другие статьи: