开发者

Can NMEA values contain '*' (asterisks)?

开发者 https://www.devze.com 2023-01-30 04:41 出处:网络
I am trying to create NMEA-compatible proprietary sentences, which may contain arbitrary strings. The usual format for an NMEA sentence with checksum is:

I am trying to create NMEA-compatible proprietary sentences, which may contain arbitrary strings.

The usual format for an NMEA sentence with checksum is:

$GPxxx,va开发者_开发百科l1,val2,...,valn*ck<cr><lf>

where * marks the start of a 2-digit checksum.

My question is: Can any of the value fields contain a * character themselves?

It would seem possible for a parser to wait for the final <cr><lf>, then to look back at the previous 3 characters to find the checksum if present (rather than just waiting for the first * in the sentence). However I don't know if the standard allows it.

Are there other characters which may cause problems?


The two ASCII characters to be careful with are $, which has to be at the start, and * which precedes the checksum. Anyone else parsing your custom NMEA wouldn't expect to find either of those characters anywhere else. Some parsers, when they hit a $ assume that a new line has started. With serial port communication sometimes characters get lost in transit, and that's why there's a $ start of sentence marker.

If you're going to make your own NMEA commands it is customary to start them with P followed by a 3 character code indicating the manufacturer or company creating the proprietary message, so you could use $PSQU. Note that although it is recommended that NMEA commands are 5 characters long, there are proprietary messages out there by various hardware and software manufacturers that are anywhere from 4 characters to 7 characters long.

Obviously if you're writing your own parser you can do what you like.

This website is rather useful:

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


If you're extending the protocol yourself (based on "proprietary") - then sure, you can put in anything you like. I would stick to ASCII, but go wild within those bounds. (Obviously, you need to come up with your own $GPxxx so as not to clash with existing messages. Perhaps a new header $SQUEL, ...)

By definition, a proprietary message will not be NMEA-compatible.

A standard parser listening to an NMEA stream should ignore anything that doesn't match what it thinks is 'good' data. That means a checksum error, or any massively corrupted message like it would think your new message is with some random *s thrown in.

If you are merely writing an existing message, then a * doesn't make sense, and should be ignored, but you run the risk of major issues if the checksum is correct, and the parser doesn't understand the payload.

0

精彩评论

暂无评论...
验证码 换一张
取 消