#!/usr/bin/env python
import re
""" Calculate the checksum for NMEA sentence
from a GPS device. An NMEA sentence comprises
a number of comma separated fields followed by
a checksum (in hex) after a "*". An example
of NMEA sentence with a correct checksum (of
0x76) is:
GPGSV,3,3,10,26,37,134,00,29,25,136,00*76"
"""
def checksum(sentence):
""" Remove any newlines """
if re.search("\n$", sentence):
sentence = sentence[:-1]
nmeadata,cksum = re.split('\*', sentence)
calc_cksum = 0
for s in nmeadata:
calc_cksum ^= ord(s)
""" Return the nmeadata, the checksum from
sentence, and the calculated checksum
"""
return nmeadata,'0x'+cksum,hex(calc_cksum)
if __name__=='__main__':
""" NMEA sentence with checksum error (3rd field
should be 10 not 20)
"""
line = "GPGSV,3,3,20,26,37,134,00,29,25,136,00*76\n"
""" Get NMEA data and checksums """
data,cksum,calc_cksum = checksum(line)
""" Verify checksum (will report checksum error) """
if cksum != calc_cksum:
print "Error in checksum for: %s" % (data)
print "Checksums are %s and %s" % (cksum,calc_cksum)