0

我正在尝试创建与 NMEA 兼容的专有句子,其中可能包含任意字符串。

带有校验和的 NMEA 语句的通常格式是:

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

where*标记 2 位校验和的开始。

我的问题是:任何值字段*本身都可以包含一个字符吗?

解析器似乎有可能等待 final <cr><lf>,然后回顾前 3 个字符以找到校验和(如果存在)(而不是仅仅等待*句子中的第一个字符)。但是我不知道标准是否允许。

是否还有其他可能导致问题的字符?

4

2 回答 2

2

需要注意的两个 ASCII 字符是 $,它必须在开头,而 * 在校验和之前。解析您的自定义 NMEA 的任何其他人都不会期望在其他任何地方找到这些字符中的任何一个。一些解析器在遇到 $ 时会假设新行已经开始。通过串行端口通信,有时字符会在传输过程中丢失,这就是为什么有 $ 句子标记开头的原因。

如果您要创建自己的 NMEA 命令,习惯上以 P 开头,后跟 3 个字符的代码,表示创建专有消息的制造商或公司,因此您可以使用 $PSQU。请注意,尽管建议 NMEA 命令长度为 5 个字符,但各种硬件和软件制造商提供的专有消息长度从 4 个字符到 7 个字符不等。

显然,如果您正在编写自己的解析器,您可以做自己喜欢的事情。

这个网站相当有用:

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

于 2011-02-24T16:05:43.863 回答
1

如果您自己扩展协议(基于“专有”) - 那么当然,您可以放入任何您喜欢的东西。我会坚持使用 ASCII,但会在这些范围内疯狂。(显然,您需要提出自己的 $GPxxx 以免与现有消息发生冲突。也许是一个新的标头 $SQUEL,...)

根据定义,专有消息将不与 NMEA 兼容。

监听 NMEA 流的标准解析器应该忽略与其认为是“好”数据不匹配的任何内容。这意味着校验和错误,或任何严重损坏的消息,例如它会认为您的新消息带有一些随机 *。

如果您只是在编写现有消息,那么 * 没有意义,应该被忽略,但如果校验和正确,并且解析器不理解有效负载,您将面临重大问题的风险。

于 2011-01-07T01:40:03.440 回答