I am trying to find the checksum for an NMEA sentence that has already been calculated by GPS.
char GPRMCBuf[POS_BUFFER] = {0xA0, 0xA2, 0x00, 0x48, 0xDD, 0x24, 0x47, 0x50, 0x52, 0x4D, 0x43, 0x2C, 0x31, 0x35, 0x30, 0x35, 0x32, 0x30, 0x2E, 0x30, 0x30, 0x30, 0x2C, 0x41, 0x2C, 0x34, 0x31, 0x32, 0x31, 0x2E, 0x37, 0x39, 0x37, 0x37, 0x2C, 0x4E, 0x2C, 0x30, 0x30, 0x32, 0x31, 0x30, 0x2E, 0x39, 0x36, 0x36, 0x37, 0x2C, 0x45, 0x2C, 0x31, 0x2E, 0x35, 0x30, 0x2C, 0x35, 0x38, 0x2E, 0x32, 0x39, 0x2C, 0x32, 0x33, 0x30, 0x37, 0x31, 0x35, 0x2C, 0x2C, 0x2C, 0x41, 0x2A, 0x35, 0x38, 0x0D, 0x0A, 0x0F, 0x05, 0xB0, 0xB3};
hear the last 3 and 4 char - a checksum that is 0F05 but we want to fix the algorithm. Our algorithm we used is as follows
Index = first, checkSum = 0, while index < msgLen, checkSum = checkSum + message[index], checkSum = checkSum AND (2^15-1). increment index.
which we wrote is as follows:
#include<stdio.h> main() { unsigned char i; unsigned short chk; char test[]={ 0x47, 0x50, 0x52, 0x4D, 0x43, 0x2C, 0x31, 0x35, 0x30, 0x35, 0x32, 0x30, 0x2E, 0x30, 0x30, 0x30, 0x2C, 0x41, 0x2C, 0x34, 0x31, 0x32, 0x31, 0x2E, 0x37, 0x39, 0x37, 0x37, 0x2C, 0x4E, 0x2C, 0x30, 0x30, 0x32, 0x31, 0x30, 0x2E, 0x39, 0x36, 0x36, 0x37, 0x2C, 0x45, 0x2C, 0x31, 0x2E, 0x35, 0x30, 0x2C, 0x35, 0x38, 0x2E, 0x32, 0x39, 0x2C, 0x32, 0x33, 0x30, 0x37, 0x31, 0x35, 0x2C, 0x2C, 0x2C, 0x41,0x2A, 0x35, 0x38, 0x0D, 0x0A}; chk = 0; for(i = 0; i < 70; i++) { chk = chk + test[i]; chk = chk & 32767; } printf("A=%hu\n", chk); return 0; }
Problem
is that we get 3588, but that should be 3845 (0F05).
Please help us solve this algorithm.