2012-10-04 50 views
5

Tengo un problema con el cálculo de la suma de comprobación para las sentencias NMEA. Estoy utilizando el siguiente código de Java:Cálculo de suma 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(); 
} 

Este código es similar a muchos otros ejemplos en todo el Internet y todo funciona bien hasta que intento una frase como esta ..

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

Esta frase es del NMEA Reference Manual y asumo que la suma de comprobación será correcta. Pero cuando lo calculo, obtengo * 2F como la suma de comprobación y no 1C.

Creo que esto se debe a los valores negativos en la oración, pero no tengo ni idea de cómo lidiar con ellos. ¿Alguien tiene una sugerencia?

+1

El signo '-' no hace ninguna diferencia: la suma de comprobación seguiría siendo' 2F' –

+0

Incorrecta, cada personaje contribuye. Sin embargo, si eliminas AMBOS de los guiones, estás en efecto XORing dos veces ... lo que te devuelve a donde estabas. Eliminar uno u otro absolutamente cambia el resultado. – Anders8

Respuesta

8

La diferencia de las sumas de comprobación asumidas y calculadas equivale a omitir (o tener un carácter extra '3'); así que estaría tentado a creer en el error en el Manual de referencia de NMEA.

Puede probar alguna calculadora NMEA en línea para verificar los resultados.
p. http://www.hhhh.org/wiml/proj/nmeaxor.html

+0

El Manual Sirf también tiene al menos otro comando erróneo "$ GPMSK, 318.0, A, 100, M, 2, * 45", que tiene una coma adicional –

+1

Entonces, ¿podría ser un error del manual? Como el "$ PSRF104,37.3875111, -121.97232,0,96000,237759,1946,12,1 * 07" también sería erróneo, obtengo un "* 06" de mi código y de la calculadora en línea, el manual dice "* 07 ". Aquí hay valores negativos otra vez, así que pensé que podría ser malo debido a ellos. – htz

+1

El error entre 06 y 07 es simplemente 01 en hexadecimal. Esto sugeriría que algunos (quizás el último carácter) deberían haber sido 0 en lugar de 1. Entonces la suma de comprobación coincidiría. Los signos '-' no parecen contribuir al error. –