2012-10-04 24 views
5

Ho un problema con il calcolo del checksum per le frasi NMEA. Sto usando il seguente codice Java:Calcolo del checksum NMEA

private static String getSum(String in) { 
    int checksum = 0; 
    if (in.startsWith("$")) { 
     in = in.substring(1, in.length()); 
    } 

    int end = in.indexOf('*'); 
    if (end == -1) 
     end = in.length(); 
    for (int i = 0; i < end; i++) { 
     checksum = checksum^in.charAt(i); 
    } 
    String hex = Integer.toHexString(checksum); 
    if (hex.length() == 1) 
     hex = "0" + hex; 
    return hex.toUpperCase(); 
} 

Questo codice è simile a molti altri esempi in giro per internet e tutto funziona bene fino a quando cerco una frase come questa ..

$PSRF101,-2686700,-4304200,3851624,96000,497260,921,12,3*1C

Questa frase è dal NMEA Reference Manual e quindi presumo che il checksum sia corretto. Ma quando lo calcolo, ottengo * 2F come checksum e non 1C.

Penso che questo sia dovuto ai valori negativi nella frase, ma non ho idea di come gestirli. Qualcuno ha un suggerimento?

+1

Il segno '-' non fa differenza: il checksum sarebbe ancora' 2F' –

+0

errato, ogni personaggio contribuisce. Se, tuttavia, rimuovi ENTRAMBI i trattini, sei in effetti XORing due volte ... che ti riporta dove eri. Rimuovere l'uno o l'altro assolutamente cambia il risultato. – Anders8

risposta

8

La differenza dell'assunto e dei checksum calcolati equivale a omettere (o con un carattere extra '3'); quindi sarei tentato di credere nell'errore nel Manuale di riferimento NMEA.

È possibile provare alcuni calcolatori NMEA online per verificare i risultati.
ad es. http://www.hhhh.org/wiml/proj/nmeaxor.html

+0

Il manuale Sirf ha anche almeno un altro comando errato "$ GPMSK, 318,0, A, 100, M, 2, * 45", che ha una virgola in più –

+1

Quindi, questo potrebbe essere un errore del manuale? Perché "$ PSRF104,37.3875111, -121.97232,0,96000,237759,1946,12,1 * 07" sarebbe errato, ricevo un "* 06" dal mio codice e dal calcolatore online, il manuale dice "* 07" . Ecco di nuovo i valori negativi, quindi ho pensato che potesse essere sbagliato a causa loro. – htz

+1

L'errore tra 06 e 07 è semplicemente 01 in esadecimale. Ciò suggerirebbe che alcuni (forse l'ultimo carattere) avrebbero dovuto essere 0 anziché 1. Quindi il checksum corrisponderebbe. I segni "-" non sembrano contribuire all'errore. –