CRC(cyclic redundancy check) 기본 설명 및 C 를 이용한 소스 구현
본 자료는 4페이지 의 미리보기를 제공합니다. 이미지를 클릭하여 주세요.
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
해당 자료는 4페이지 까지만 미리보기를 제공합니다.
4페이지 이후부터 다운로드 후 확인할 수 있습니다.

목차

없음

본문내용

%08s ", bitSeq);
}
for( i = 0; i < 4; ++i )
{
printf("00000000 ");
}
printf("\n");
crc = CRCGENERATOR(data, sizeData);// CRC 생성구문 사용
ltoa(crc, bitSeq, 2);
printf("Remainder: %032s\n", bitSeq);// 송신에서 구한 CRC 출력
data[sizeData] = (unsigned char) ((crc >> 24) & 0x000000FF);// 데이터에 CRC를 덧붙힌다
data[sizeData + 1] = (unsigned char) ((crc >> 16) & 0x000000FF);
data[sizeData + 2] = (unsigned char) ((crc >> 8) & 0x000000FF);
data[sizeData + 3] = (unsigned char) (crc & 0x000000FF);
sizeData += 4;
*size = sizeData;
}
// 수신측 시뮬레이션
// data: 받은 데이터 (데이터 + CRC)
// size: 받은 데이터의 크기 ("데이터 + CRC"의 크기)
void Receiver(unsigned char *data, unsigned long size)
{
unsigned char recvData[MAX_DATA_LENGTH];
unsigned long i;
charbitSeq[256];// 비트 시퀀스를 출력하기 위한 buffer
unsigned long remainder;
for( ; ; )// 수신측이 에러가 없다고 판단할 때까지 무한 반복
{
DATA_Transfer(data, recvData, size);
printf("\nReceiver:\n\n");// 수신 데이터의 비트 정보 출력
for( i = 0; i < size; ++i )
{
memset(bitSeq, 0, sizeof(char) * 10);
itoa(recvData[i], bitSeq, 2);
if( strlen(bitSeq) > 8 )
{
strncpy(bitSeq, bitSeq + strlen(bitSeq) - 8 + 1, 8);
}
printf("%08s ", bitSeq);
}
printf("\n");
remainder = CRCCHECKER(recvData, size);// CRC 체크
ltoa(remainder, bitSeq, 2);
printf("Remainder: %032s\n", bitSeq);// 수신측 remainder 출력
printf("\n"); // 수신 데이터의 비트 추가 정보 출력
for( i = 0; i < size - 4; ++i )
{
memset(bitSeq, 0, sizeof(char) * 10);
itoa(recvData[i], bitSeq, 2);
if( strlen(bitSeq) > 8 )
{
strncpy(bitSeq, bitSeq + strlen(bitSeq) - 8 + 1, 8);
}
printf("%-5c:%08s\n", recvData[i], bitSeq);
}
if( remainder == 0 )// 에러가 발생하지 않았다면?
{
break;// 루프 탈출->종료
}
}
}
// 송신 시뮬레이션, 에러 발생 루틴 포함
// sendData: 보낼 데이터 (데이터 + CRC)
// recvData: 받은 데이터 (데이터 + CRC): 에러가 포함된다
// size: 보낼 데이터의 크기 ("데이터 + CRC"의 크기)
void DATA_Transfer(unsigned char *sendData, unsigned char *recvData, unsigned long size)
{
char ERROR = 0;// 문자 하나를 저장하기 위한 버퍼
unsigned long i; // unsigned long 형 변수 i 선언
memset(recvData, 0, sizeof(unsigned char) * MAX_DATA_LENGTH);
memcpy(recvData, sendData, size);
for( i = 0; i < size * 8; ++i )//if 문 i가 size*8 (bits) 보다 크지 않을 때 까지 증가
{
if( rand() % 1000 == 0 )// 0.1% 확률 실현
{
ERROR = ERROR | (sendData[(int)(i / 8)] | (char)i);
// 0.1%의 확률이 실현되면 error 발생(i값을 seed로 error발생).
}
else
{
ERROR = sendData[(int)(i / 8)];
}
if( i % 8 == 7 )
{
recvData[i / 8] = ERROR;
ERROR = 0;
}
}
}
3. 실행결과에 대한 설명
project라는 text를 sender에서 보내려고 한다. receiver에서 에러 없이 데이터를 수신했으므로 재전송을 요청하지 않았다. 에러발생확률이 0.1%이고, 전송하는 데이터양이 많지 않아서 CRC error check가 정확히 이루어지는지 알 수 없다.
에러발생확률을 10%로 수정한 후 실행시킨 화면이다. sender는 ‘project’라는 입력을 보냈지만 첫 번째 수신할 때 receiver에서 ‘projgct’를 받았으므로 Remainder가 모두 0이 아니다. 따라서 재전송을 요청했고, 두 번째 수신한 데이터는 error가 발생하지 않았으며 Remainder 역시 모두 0이다. 따라서 프로그램이 제대로 동작한다는 것을 짐작할 수 있다.
e(0110010)의 2번째 bit에서 0⇒1 바꿔었다. Receiver에서 Remainder가 모두 0이 아니므로 재전송을 요청하였고, 에러없이 전송을 완료하였다.
4. 그 외 필요한 설명
위의 CRC 코드는 CRC의 기본 원리에만 충실한 코드이다. Sender가 어떻게 데이터를 보내고 Receiver가 어떻게 받는지는 고려하지 않았다. Network의 상태나 주변 Noise등에 의한 bit error 효과는 단순한 random 함수를 이용해서 나타내었다. 실제적으로 한번 error가 발생한 곳에 또 발생할 수 있지만 그 부분은 고려하지 않았다.

키워드

  • 가격4,000
  • 페이지수14페이지
  • 등록일2008.03.07
  • 저작시기2007.6
  • 파일형식한글(hwp)
  • 자료번호#453894
본 자료는 최근 2주간 다운받은 회원이 없습니다.
청소해
다운로드 장바구니