I have worked with NMEA, my experience is:
The NMEA format is not well designed.
Professional applications, that have direct access to the GPS receiver, should avoid NMEA. They should consider the specific binary format of the GPS device.
In addition to the topics mentioned by Adam Davis above:
- Its not defined how to deal with invalid attributes: e.g. If the vehicle is standing still, especially, if it has not moved since starting the GPS receiver, the course/heading attribute is invalid; Most receivers will output an empty attribute ",,". But this is undefined.
- The time field: Some vendors use a fractional part after the second. Its not exactly specified(?) if that is allowed, or not; some devices do that, others not. (Further: the GGA sentence defines two digits after the second, the RMC sentence use integral seconds)
- The order of the RMC, GSV, etc. sentences are different from one receiver to the other.
That leads to the problem to know when a position fix is complete. Either you check that a new time stamp arrived, then you know that the position is complete, but then you will loose one second, in terms of real time behavior. Or you know your receiver, and know which is the last sentence of a fix. Or you do some "artificial intelligence" to analyze the order in the first ten seconds, and then you know which is the last.
You can look in the SIRF and UBLOX protocol specification, and see what huge chapters they have, to describe how they interprete the NMEA protocol.
If somebody knows a really good NMEA parser / writer written in java or Objective-C, that is open source and not under the GPL license, please let me know.