我正在尝试创建兼容NMEA的专有句子,这些句子可能包含任意字符串。
带校验和的NMEA句子的通常格式是:
$GPxxx,val1,val2,...,valn*ck<cr><lf>
其中*
标志着2位校验和的开始。
我的问题是:任何值字段都可以包含*
字符吗?
解析器似乎可以等待最后的<cr><lf>
,然后回顾前3个字符以查找校验和(如果存在)(而不是仅仅等待第一个*
这句话)。但是我不知道标准是否允许它。
是否还有其他可能导致问题的字符?
答案 0 :(得分:2)
要注意的两个ASCII字符是$,它必须在开头,而*在校验和之前。解析自定义NMEA的任何人都不希望在其他地方找到这些字符中的任何一个。一些解析器,当他们点击$时假设新行已经开始。使用串口通信时,有时字符会在传输过程中丢失,这就是为什么有一个$ start的句子标记。
如果您打算制作自己的NMEA命令,通常会使用P后跟一个3字符代码来启动它们,这些代码表示制造商或公司创建专有消息,因此您可以使用$ PSQU。请注意,尽管建议NMEA命令长度为5个字符,但各种硬件和软件制造商都有专有消息,长度为4个字符到7个字符。
显然,如果你正在编写自己的解析器,你可以做你喜欢的事。
这个网站非常有用:
答案 1 :(得分:1)
如果你自己扩展协议(基于“专有”) - 那么你可以放入你喜欢的任何东西。我会坚持使用ASCII,但在这些范围内疯狂。 (显然,您需要提出自己的$ GPxxx,以免与现有消息发生冲突。也许是新的标头$ SQUEL,...)
根据定义,专有消息不会与NMEA兼容。
监听NMEA流的标准解析器应忽略任何与其认为的“好”数据不匹配的内容。这意味着校验和错误,或任何大规模损坏的消息,就像它会认为你的新消息是一些随机*抛出。
如果您只是编写现有消息,那么*没有意义,应该被忽略,但如果校验和正确,并且解析器无法理解有效负载,则存在重大问题的风险。