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 (*).