模棱两可的过程calcChecksum

时间:2019-07-02 08:57:24

标签: module arduino

上下文 我正在使用编写的代码来与通过串行通信连接到Arduino的GPS模块一起使用。该模块以标题(0xb5、0x62)开头每个数据包,以您请求的信息继续,并以校验和,CK_A和CK_B字节结尾。我不了解计算该校验和的代码。有关模块协议(https://www.u-blox.com/sites/default/files/products/documents/u-blox7-V14_ReceiverDescriptionProtocolSpec_%28GPS.G7-SW-12001%29_Public.pdf)中校验和算法(8位Fletcher算法)的更多信息,第74页(带索引的87)。

更多信息 只是想了解代码,它工作正常。在UBX协议中,我提到过还有一段代码解释了它的工作方式(不是用c ++编写的)

struct NAV_POSLLH {
//Here goes the struct
};

NAV_POSLLH posllh;

void calcChecksum(unsigned char* CK) {
 memset(CK, 0, 2);
 for (int i = 0; i < (int)sizeof(NAV_POSLLH); i++) {
  CK[0] += ((unsigned char*)(&posllh))[i];
  CK[1] += CK[0];
 }
}

1 个答案:

答案 0 :(得分:0)

在您提供的链接中,您可以找到RFC 1145的链接,其中也包含该Fletcher 8 bit算法并进行解释

  

可以证明,循环A的末尾将包含8位   数据报中所有八位位组的1的补码和,而B将   包含(n)* D [0] +(n-1)* D [1] + ... + D [n-1]。

n =字节D []的大小;
将行情调整为C语法

用几个字节,笔和纸尝试一下,您会看到:)