NMEA校验和计算

8

我在计算NMEA语句的校验和时遇到了问题。我正在使用以下Java代码:

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参考手册,因此我认为校验和应该是正确的。但是当我计算它时,我得到的校验和是*2F而不是1C。

我认为这是由于句子中含有负值,但我不知道如何处理它们。有人有建议吗?


1
“-”符号没有影响:校验和仍将为“2F”。 - David Grant
不正确,每个字符都有贡献。然而,如果您同时删除两个破折号,则实际上进行了两次异或运算...这会使您回到原来的位置。删除其中一个绝对会改变结果。 - Anders8
1个回答

8

假定和计算校验和的差异等于省略(或多了一个字符 '3' ); 因此,我想相信 NMEA 参考手册中存在错误。

您可以尝试一些在线 NMEA 计算器来验证结果。
例如:http://www.hhhh.org/wiml/proj/nmeaxor.html


Sirf手册中还有至少一个错误的命令"$GPMSK,318.0,A,100,M,2,*45",其中有一个多余的逗号。 - Aki Suihkonen
1
所以,这可能是手册的错误吗?因为"$PSRF104,37.3875111,-121.97232,0,96000,237759,1946,12,1*07"也会出错,我的代码和在线计算器都得到了"*06",而手册上却写着"*07"。这里又出现了负值,所以我认为可能是因为它们而出错了。 - htz
1
06和07之间的错误是十六进制中的01。这表明某些内容(也许是最后一个字符)应该是0而不是1。然后校验和将匹配。'-'符号似乎对错误没有影响。 - Aki Suihkonen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接