2018-01-29 12:43:22 +00:00
|
|
|
#include "nmea.h"
|
|
|
|
|
|
|
|
uint8_t NMEA_Check(uint8_t *NMEA, uint8_t Len) // NMEA check-sum
|
|
|
|
{ uint8_t Check=0; // to be calculated over characters between '$' and '*' but _excluding_ those.
|
|
|
|
for(uint8_t Idx=0; Idx<Len; Idx++)
|
|
|
|
Check^=NMEA[Idx];
|
|
|
|
return Check; }
|
|
|
|
|
|
|
|
uint8_t NMEA_AppendCheck(uint8_t *NMEA, uint8_t Len)
|
2023-05-20 15:57:07 +00:00
|
|
|
{ uint8_t Check=NMEA_Check(NMEA+1, Len-1); // exclude the starting '$'
|
|
|
|
NMEA[Len ]='*'; // add '*'
|
|
|
|
uint8_t Digit=Check>>4; NMEA[Len+1] = Digit<10 ? Digit+'0':Digit+'A'-10; // and checksum in hex
|
2018-01-29 12:43:22 +00:00
|
|
|
Digit=Check&0xF; NMEA[Len+2] = Digit<10 ? Digit+'0':Digit+'A'-10;
|
2023-05-20 15:57:07 +00:00
|
|
|
return 3; } // return number of characters added
|
2018-01-29 12:43:22 +00:00
|
|
|
|
|
|
|
uint8_t NMEA_AppendCheckCRNL(uint8_t *NMEA, uint8_t Len)
|
2023-06-10 11:37:07 +00:00
|
|
|
{ uint8_t CheckLen=NMEA_AppendCheck(NMEA, Len); // add *XY, return number of added characters (=3)
|
2023-05-20 15:57:07 +00:00
|
|
|
Len+=CheckLen; NMEA[Len++]='\r'; NMEA[Len++]='\n'; NMEA[Len]=0; // add CR, LF, NL
|
2023-06-10 11:37:07 +00:00
|
|
|
return CheckLen+2; } // return number of added characters (3+2=5)
|