Неоднозначный процесс calcChecksum - PullRequest
0 голосов
/ 02 июля 2019

КОНТЕКСТ Я использую код, написанный для работы с модулем GPS, который подключается к Arduino через последовательную связь. Модуль начинает каждый пакет с заголовка (0xb5, 0x62), продолжает запрашиваемую информацию и заканчивается байтами контрольной суммы, CK_A и CK_B. Я не понимаю код, который вычисляет эту контрольную сумму. Подробнее об алгоритме контрольной суммы (8-битный алгоритм Флетчера) в протоколе модуля (https://www.u -blox.com / sites / default / files / products / documents / u-blox7-V14_ReceiverDescriptionProtocolSpec_% 28GPS.G7- SW-12001% 29_Public.pdf ), стр. 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 голосов
/ 02 июля 2019

В предоставленной вами ссылке вы можете найти ссылку на RFC 1145, которая также содержит этот алгоритм Fletcher 8 bit и объясняет

Можно показать, что в конце цикла A будетсодержит сумму 8-битного дополнения 1 всех октетов в дейтаграмме, и этот B будет содержать (n) * D [0] + (n-1) * D [1] + ... + D [n-1].

n = размер байта D [];
Цитата скорректирована с учетом синтаксиса C

Попробуйте это с парой байтов, ручкой и бумагой,и вы увидите:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...