티스토리 뷰

심화

패킷 통신 - CRC

Just4Fun 2016. 8. 11. 21:22

통신에 있어서 데이터를 수신하는 측에서는 수신한 데이터가 오류없이 제대로 들어왔는지 궁금할 때가 있다.  전송 선로의 길이가 길거나, 아니면 아예 선이 없는 무선 통신의 경우에는 더더욱 수신된 데이터에 대한 신뢰가 떨어지게 된다.


이러한 이유로 다양한 방법을 사용해서 수신된 데이터에 오류가 발생했는지 여부를 확인할 수 있게 한다.  쉽게 사용할 수 있는 방법이 체크섬(check sum)이다.

이 방법은 8비트 혹은 16비트 단위로 모든 데이터를 더해서 그 마지막 결과값을 추가로 데이터에 덧붙여 보내주면, 수신측에서 동일한 계산을 하여 check sum값이 같은지 비교해서 수신한 데이터의 오류를 판단할 수 있게 하는것이다.  그러나 단순한 덧셈 연산이기 때문에 어떤 데이터에 1이 더한 값이 전달되고, 다른 데이터는 1 적은 값이 수신되었을 때에는 check sum은 같은 값으로 계산이 되어 실제로는 오류가 두개가 발생했음에도 불구하고 수신측에서는 데이터에 오류가 없다고 판단하게 된다.


Check sum 보다 좀더 오류에 대한 신뢰성 있는 검사 방법이 CRC를 이용하는 것이다.

CRC는 간단히 얘기해서 수신된 데이터를 특정 패턴으로 나누기를 수행하여 최종 나머지 값을 데이터에 덧붙여 보내는 방법이다.  나누기 계산이기 때문에 한 비트라도 데이터에 오류가 있으면 나머지 값이 완전히 달라지기 때문에 훨씬 높은 신뢰성을 보장한다고 볼 수 있다.


앞의 글에서 나온 HDLC 패킷의 Stop flag 바로 앞에 있는 FCS가 바로 CRC에 해당되는 필드이다.

CRC 구하는 방법도 굉장히 많지만 HDLC에서 사용하는 CRC16-CCITT를 이용하여 CRC 계산을 수행하도록 하겠다.


CRC를 계산 하는 방법은 입문 과정의 LED 온도계 2에서 설명하였듯이 매번 수신된 데이터에 대하여 CRC 공식을 적용해서 계산할 수도 있고, 아니면, 처음부터 CRC 테이블을 만들어 놓고 이 테이블에서 각 데이터에 따른 값을 불러와서 CRC를 계산할 수도 있다.


이 블로그에서는 테이블 방식을 이용해서 CRC를 계산하도록 하겠다.


테이블 방식의 CRC 계산의 단점은 CRC 테이블이 많은 양의 SRAM 메모리를 점유하게 된다는 것이다.  위의 코드에 나오는 crc16_tab[]의 크기는 512바이트이다.  이 크기는 ATmega328의 전체 SRAM 메모리 크기인 2Kbyte의 1/4에 해당하는 크기이다.  결코 작은 크기가 아닌것을 알 수 있다.

CRC 테이블은 읽기 전용 데이터이므로 굳이 SRAM 메모리에 위치시킬 필요가 없고, 플래쉬메모리 영역에 위치시켜도 된다.  이를 위하여 crc16_tab[] 다음에 PROGMEM이라는 것을 추가하여 program memory space에 위치 시키도록 한다.


Program memory에 있는 데이터를 읽어 올때는 그냥 읽어 올수가 없고 pgm_read_word()라는 함수를 사용하여야 한다.


send_packet() 함수에서는 일단 데이터 부분에 대해서 CRC값을 먼저 구한다.  그 이후 데이터 부분을 UART로 내 보낸후 뒤이어 CRC값을 내 보낸다.  물론 데이터와 CRC 앞뒤에 Start/Stop flag를 보내어 패킷의 시작과 끝을 알려줘야 한다.


컴퓨터에서 crc를 포함한 데이터가 수신되는지 확인한다.


빨간색 박스 부분이 crc값에 해당되는 것이다.  그럼 이 값이 제대로된 CRC값인지 컴퓨터 프로그램에서 CRC검사를 하여 같은 값이 나오는지 확인해 보도록 하겠다.

참고로 수신측에서는 CRC값까지 포함하여 CRC검사를 하면 항상 0이 나와야 한다.  0이 아닌값이 나오면 데이터에 오류가 있다고 판단할 수 있다.


CRC 검사를 수행한 결과는 다음과 같다.

CRC 계산을 한 결과값이 모두 0이 됨을 볼 수 있다.  그렇다는 얘기는 데이터에 에러가 발생하지 않았다고 판단할 수 있는 것이다.


crc16.cpacket.cSerialPacket.py



심화 과정 목차

'심화' 카테고리의 다른 글

패킷 통신 - Request/Reply  (0) 2016.08.12
패킷 통신 - Message ID  (0) 2016.08.12
패킷 통신 - Start/Stop flag  (7) 2016.08.10
패킷 통신 - 바이너리 데이터(Binary data)  (0) 2016.08.03
패킷 통신 - PC 프로그램  (0) 2016.08.03
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함