Я пытаюсь понять (и впоследствии реализовать) проверку crc16, используемую прошивкой чистых полетов quadrocopter для проверки пакета srxl.Генерация и проверка CRC16
SRXL - это простой последовательный протокол для передачи значений сервопривода через одну последовательную линию.
пакет структура, как это:
CRC16 проверяется с помощью следующей функции:
//srxlFrameLength is the package length
//srxlFrame is the received package buffer
uint16_t crc_calc = 0;
for (i = 0; i < srxlFrameLength; i++) {
crc_calc = crc16_CCITT(crc_calc, srxlFrame[i]);
}
if(crcCalc == 0){ //package is valid }
Я не понимаю, как это работает. Если бы я реализовал это, я бы вычислил crc итеративно для всех байтов пакета, пока не дойду до сохраненного crc, а затем сравните с сохраненным crc. почему эта реализация также работает?
Я также хотел бы реализовать код генератора пакетов для стороны отправителя. Будет ли возможность реализовать Crc поколение так:
uint16_t crc_calc = 0;
for(int i = 0; i < packetLength; ++i){
crc_calc = crc16_CCITT(crc_calc, packet[i]);
}
//concat calculated crc16 to packet here.
Спасибо заранее,
Malte
Большое спасибо, это имеет смысл. Наверное, сейчас я рассмотрю особенности CRC. – Malte