2012-10-04 19 views
5

Mam problem z obliczeniem sumy kontrolnej dla zdań NMEA. Używam następujący kod Java:Obliczanie sumy kontrolnej 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(); 
} 

Kod ten jest podobny do wielu innych przykładów w całym internecie i wszystko działa dobrze, dopóki próbuję zdanie tak ..

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

tym zdaniu pochodzi z NMEA Reference Manual i dlatego zakładam, że suma kontrolna będzie poprawna. Ale kiedy to policzę, otrzymuję * 2F jako sumę kontrolną, a nie 1C.

Myślę, że dzieje się tak z powodu ujemnych wartości w zdaniu, ale nie mam pojęcia, jak sobie z nimi poradzić. Czy ktoś ma sugestię?

+1

Znak '-' nie robi różnicy: suma kontrolna nadal będzie wynosić' 2F' –

+0

Niepoprawnie, każda postać wnosi swój wkład. Jeśli jednak zdejmiesz BOTH z kresek, zaczniesz XORing dwa razy ... co pozwoli ci wrócić tam, gdzie byłeś. Usunięcie jednego z nich całkowicie zmienia wynik. – Anders8

Odpowiedz

8

Różnica między przyjętymi i obliczonymi sumami kontrolnymi jest równa pominięciu (lub dodatkowego znaku "3"); , więc byłbym skłonny uwierzyć w błąd w podręczniku NMEA Reference Manual.

Możesz wypróbować online kalkulator NMEA, aby zweryfikować wyniki.
np. http://www.hhhh.org/wiml/proj/nmeaxor.html

+0

Instrukcja Sirf ma również co najmniej jedno inne błędne polecenie "$ GPMSK, 318,0, A, 100, M, 2, * 45", które ma dodatkowy przecinek –

+1

Więc może to być błąd instrukcji? Ponieważ "$ PSRF104,37875111, -121.97232,0,96000,237759,1946,12,1 * 07" również byłoby błędne, otrzymuję "* 06" z mojego kodu i kalkulatora online, instrukcja mówi "* 07 ". Ponownie są ujemne wartości, więc pomyślałem, że może to być spowodowane przez nich. – htz

+1

Błąd między 06 a 07 to po prostu 01 w systemie szesnastkowym. Sugerowałoby to, że niektóre (być może ostatnie znaki) powinny mieć wartość 0 zamiast 1. Wtedy suma kontrolna byłaby zgodna. Znaki "-" nie wydają się przyczyniać do błędu. –

Powiązane problemy