Могут ли значения NMEA содержать «*» (звездочки)? - PullRequest
0 голосов
/ 14 декабря 2010

Я пытаюсь создать совместимые предложения NMEA, которые могут содержать произвольные строки.

Обычный формат предложения NMEA с контрольной суммой:

$GPxxx,val1,val2,...,valn*ck<cr><lf>

, где * отмечает начало двухзначной контрольной суммы.

Мой вопрос: может ли любое из полей значений содержать символ *?

Казалось бы, парсер может дождаться последнего <cr><lf>, а затем оглянуться назад на предыдущие 3 символа, чтобы найти контрольную сумму, если она присутствует (вместо того, чтобы просто ждать первого * в предложении). Однако я не знаю, позволяет ли это стандарт.

Существуют ли другие символы, которые могут вызывать проблемы?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2011

Два символа ASCII, которые следует соблюдать осторожность, это $, который должен быть в начале, и *, который предшествует контрольной сумме.Любой другой, разбирающий ваш пользовательский NMEA, не ожидал бы найти ни одного из этих символов где-либо еще.Некоторые парсеры, когда они нажимают $, предполагают, что началась новая строка.При связи через последовательный порт символы иногда теряются при передаче, и поэтому есть маркер $ start of предложения.

Если вы собираетесь делать свои собственные команды NMEA, обычно их начинают с P, а затем сТрехзначный код, указывающий производителя или компанию, создающую собственное сообщение, чтобы вы могли использовать $ PSQU.Обратите внимание, что, хотя рекомендуется, чтобы команды NMEA имели длину 5 символов, существуют различные проприетарные сообщения от различных производителей оборудования и программного обеспечения длиной от 4 символов до 7 символов.

Очевидно, что если вы пишетесобственный парсер вы можете делать что угодно.

Этот сайт довольно полезен:

http://www.gpsinformation.org/dale/nmea.htm

1 голос
/ 07 января 2011

Если вы расширяете протокол самостоятельно (на основе «проприетарного») - тогда, конечно, вы можете добавить что угодно.Я бы придерживался ASCII, но без ума от этих границ.(Очевидно, вам нужно придумать свой собственный $ GPxxx, чтобы не конфликтовать с существующими сообщениями. Возможно, новый заголовок $ SQUEL, ...)

По определению, проприетарное сообщение не будет NMEA-совместимый.

Стандартный синтаксический анализатор, слушающий поток NMEA, должен игнорировать все, что не соответствует тому, что он считает «хорошими» данными.Это означает, что ошибка контрольной суммы или любое сильно поврежденное сообщение, как если бы вы думали, что в вашем новом сообщении есть несколько случайных * s.

Если вы просто пишете существующее сообщение, тогда * не имеет смысла, и его следует игнорировать, но вы рискуете столкнуться с серьезными проблемами, если контрольная сумма верна и анализатор не понимает полезную нагрузку.

...