2017-01-24 1 views
0

srxl 패키지 검증을 위해 클린 플라이트 쿼드 로콥터 펌웨어에서 사용하는 crc16 검증을 이해하려고합니다.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 iterativly를 계산할 것이고 저장된 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. 

감사합니다,

말테

답변

4

를, 그것은 속성이 있습니다 메시지의 CRC와 연결된 CRC는 오류가 없다고 가정하고 상수이다. CRC의 정의에 따라 그 상수는 0 일 수 있습니다.

이유는 CRC가 N는 CRC 비트의 길이이고, 메시지 배 X N의 다항식 나눗셈의 나머지는 실질적으로 점이다. 따라서 메시지에 CRC를 추가하면 마지막으로 n 개의 0이 나머지로 대체되므로 잔여가없는 모든 부분이 나뉩니다. (바이너리 다항식의 음수는 다항식입니다. 왜냐하면 그 자체와의 무언가의 배타적 논리합은 0이기 때문입니다.)

네가 원한다면 대신에 메시지에서 CRC를 계산할 수 있습니다. 메시지에 첨부 된 CRC 결과.

+0

감사합니다. 나는 지금 CRC 특성을 볼 것입니다. – Malte