2010-12-14 80 views
0

我正在尝试创建可能包含任意字符串的NMEA兼容专有句子。NMEA值可以包含'*'(星号)吗?

用于与校验NMEA语句通常格式是:

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

其中*标志着一个2位的校验和的开始。

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

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

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

回答

2

要注意的两个ASCII字符是$,它必须在开始位置,而*位于校验和前面。任何解析您的自定义NMEA的人都不希望在其他任何地方找到这些字符。一些解析器,当他们碰到$时,假定新行已经开始。通过串口通讯,有时候字符会在传输过程中丢失,这就是为什么有一个句子标记的开始。

如果您打算制作自己的NMEA命令,通常先用P开头,后面跟着3个字符的代码,表示制造商或公司创建专有消息,因此您可以使用$ PSQU。请注意,尽管建议NMEA命令的长度为5个字符,但各种硬件和软件制造商都有专有消息,这些消息的长度从4个字符到7个字符不等。

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

这个网站是相当有用:

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

1

如果你自己扩展协议(基于“专有”) - 那么确定,你可以放入任何你喜欢的东西。我会坚持使用ASCII码,但在这些界限之内疯狂。 (显然,你需要拿出你自己的$ GPxxx,以免与现有消息冲突,也许是一个新的头文件$ SQUEL,...)

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

监听NMEA流的标准解析器应忽略任何与它认为“不错”数据不匹配的内容。这意味着一个校验错误,或任何大规模损坏的消息,就像它会认为你的新消息带有一些随机* s。

如果你只是写一个现有的消息,那么*没有意义,并且应该被忽略,但是如果校验和是正确的,那么你冒着重大问题的风险,并且解析器不理解有效载荷。

+0

谢谢,非常翔实!我猜“NMEA兼容”我的意思是它遵循NMEA的句子结构。我想我会避免(或翻译)'*'。 – squelart 2011-01-07 04:18:48