2017-01-24 11 views
0

Я пытаюсь понять (и впоследствии реализовать) проверку crc16, используемую прошивкой чистых полетов quadrocopter для проверки пакета srxl.Генерация и проверка CRC16

SRXL - это простой последовательный протокол для передачи значений сервопривода через одну последовательную линию.

пакет структура, как это:

protocol structure

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

ответ

4

Если CRC правильно хранится в конце сообщения, оно обладает свойством что CRC сообщения и конкатенированный CRC является константой, не допуская ошибок. В зависимости от определения CRC эта константа может быть равна нулю.

Причина заключается в том, что ЦИК, по существу, оставшаяся часть многочлена разделения времени сообщений х п, где п является длина CRC в битах. Поэтому, когда вы добавляете CRC в сообщение, вы заменяете последние n нулями с остатком, в результате чего деление всего предмета не имеет остатка. (Обратите внимание, что отрицание двоичного многочлена является полиномом, так как исключение или что-то с собой равно нулю.)

Да, если вам нравится, вы можете вместо этого вычислить CRC только для сообщения, а затем сравнить результат к CRC, добавленному к сообщению.

+0

Большое спасибо, это имеет смысл. Наверное, сейчас я рассмотрю особенности CRC. – Malte