上下文 我正在使用编写的代码来与通过串行通信连接到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];
}
}
答案 0 :(得分:0)
在您提供的链接中,您可以找到RFC 1145的链接,其中也包含该Fletcher 8 bit
算法并进行解释
可以证明,循环A的末尾将包含8位 数据报中所有八位位组的1的补码和,而B将 包含(n)* D [0] +(n-1)* D [1] + ... + D [n-1]。
n =字节D []的大小;
将行情调整为C语法
用几个字节,笔和纸尝试一下,您会看到:)