Created: 2022-06-14 14:48 | Updated: 2022-06-14 14:50 |
Para calcular o checksum de um frame GPS padrão NMEA 0183, pode ser utilizado o seguinte algoritmo (Python):
def nmea_checksum(nmea_sentence: str) -> int:
'''nmea_sentence example:
$GPRMC,182545.00,A,2245.41399,S,04723.04512,W,0.0,,080622,15.6,W,A,V*48
'''
nmea = nmea_sentence[1 : nmea_sentence.index("*")]
sum = 0
for c in nmea:
sum ^= ord(c)
return sum
Em C, o seguinte código pode ser utilizado:
int nmea0183_checksum(char *nmea_data)
{
int crc = 0;
int i;
for (i = 1; i < strlen(nmea_data) - 3; i ++) {
crc ^= nmea_data[i];
}
return crc;
}
Exemplo de frame GPS:
$GPRMC,182545.00,A,2245.41399,S,04723.04512,W,0.0,,080622,15.6,W,A,V*48
No frame, o checksum corresponde ao trecho final do frame, iniciado pelo asterisco (*).
Para efeito de cálculo do checksum, o frame a ser considerado começa após o inicializador ($) e termina, mas não inclui, no caractere asterisco(*).
Após o cálculo do checksum, o valor obtido é adicionado ao final do frame (formatado como 2 caracteres hexadecimias) precedido pelo asterisco (*).