목차
없음
본문내용
%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가 발생한 곳에 또 발생할 수 있지만 그 부분은 고려하지 않았다.
}
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가 발생한 곳에 또 발생할 수 있지만 그 부분은 고려하지 않았다.
추천자료
- Programing Language Chapter 7 연습문제
- ICH 환자의 간호과정 사례연구 보고서
- 말더듬 이론과 치료
- 정신지체아동에 관하여
- [행동수정 이론][행동수정 사례][행동수정][행동][문제행동][표적행동]행동수정 이론과 행동...
- 모성간호학 실습 - PID case
- 크룹 간호과정
- [간염][간경변][간종양][간암][간질환]간염(간염의 감염 경로, 간염의 종류), 간경변(간경변...
- 아동기
- cerebral plasy 뇌성마비 Case study 진단 5개
- 2014년 2학기 학교폭력의예방및대책 기말시험 핵심체크
- 2014년 2학기 학교폭력의예방및대책 멀티미디어 강의 전 범위 핵심요약노트
- 2015년 2학기 학교폭력의예방및대책 멀티미디어 강의 전 범위 핵심요약노트
- 자폐증(전반적 발달장애, 자폐장애)의 진단과 평가 - 자폐증의 진단기준, 자폐증(전반적 발달...