2012-10-04 296 views
5

我在計算NMEA句子的校驗和時遇到了問題。我使用下面的Java代碼: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(); 
} 

此代碼是類似於在互聯網附近許多其他的例子,直到我嘗試這樣的句子,一切工作正常..

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

這句話是從NMEA Reference Manual,所以我假設校驗和是正確的。但是當我計算它時,我得到* 2F作爲校驗和而不是1C。

我認爲這是因爲句子中的否定值,但我不知道如何處理它們。有人有建議嗎?

+1

「-'符號沒有區別:校驗和仍然是」2F「 –

+0

不正確,每個字符都有貢獻。但是,如果你刪除兩個破折號,你實際上是兩次異或,這會讓你回到原來的位置。刪除一個或另一個絕對會改變結果。 – Anders8

回答

8

假設和計算校驗和的差值等於省略 (或者有一個額外的字符'3'); 所以我很想在NMEA參考手冊中錯誤地相信。

您可以嘗試一些在線NMEA計算器來驗證結果。
例如http://www.hhhh.org/wiml/proj/nmeaxor.html

+0

Sirf手冊還有至少一個其他錯誤的命令「$ GPMSK,318.0,A,100,M,2,* 45」,它有一個額外的逗號 –

+1

所以,這可能是手冊的錯誤?因爲「$ PSRF104,37.3875111,-121.97232,0,96000,237759,1946,12,1 * 07」也是錯誤的,所以我從我的代碼和在線計算器中得到一個「* 06」,手冊中說「* 06」 07" 。這裏再次是否定的價值觀,所以我認爲這可能是錯誤的,因爲他們。 – htz

+1

06和07之間的錯誤只是十六進制的01。這表明一些(也許是最後一個字符)應該是0而不是1.然後校驗和會匹配。 ' - '符號似乎不會導致錯誤。 –