본문 바로가기

Daily Report

111028 RF Serial 서론 / 선택정렬법

RF(Radio Frequence) : 선이 없는 통신을 뜻합니다
=>핸드폰 DMB 라디오 TV모두 여기에 속합니다

RFID 무선으로 개체를 식별 하는것을 뜻합니다

이렇게 식별하는 방법에는 접촉식과 비접촉식으로 뉘는데
접촉식 - 신용카드단말기
비접촉식 - 버스카드단말기

ISO15693

    ->      ->
pc      R       C
    <-      <-
여기서 pc부분을 Host Command인데 여기서 pc <==>  R 통신에는 Serial통신을 이용합니다

Spec
spec에서 아래 목록부분만 다루기로 합니다
1. Data Transmission
2. Asynchrous Interface
5. 리더기를 제어
6. 리더기를 통해 카드를 제어

1. Data Transmission 데이터 전송
mode>>
1) address mode : UID를 사용하는 모드

 

2) nonaddress mode : UID를 사용하지 않는 모드

3) select mode : UID를 선택하영 사용하는 모드

2. Asynchronous Interface



과제>>CRC16함수를 만드시오

16bit checksum 함수

함수 이름 :  CRC16
반환형 : unsigned short
인자 :  (void * p , unsigned int cnt)
변수 :  unsigned char * DATA = p
   =>인자를  void * DATA 변수 선언이 필요없다

CRC로 리턴

#include <stdio.h>

#define CRC_POLYNOM  0x8408
#define CRC_PRESET  0xFFFF

unsigned short CRC16(void *p,unsigned int cnt)
{
  int i;
  int j;

  unsigned short crc = CRC_PRESET;
  unsigned char *DATA = p;

  for (i = 0; i < cnt; i++) /* cnt = number of protocol bytes without CRC */
  {
    crc ^= DATA[i];
    for (j = 0; j < 8; j++)
    {
      if (crc & 0x0001)
      crc = (crc >> 1) ^ CRC_POLYNOM;
      
      else
      crc = (crc >> 1);
    }
  }  
  return crc;
}


.삽입정렬법
삽입 정렬과 버블 정렬은 비슷한 정렬(sorting) 기법입니다. 두 방법의 차이는 간단히 첫번째 반복(iteration)에서 가장 작은 값(또는 가장 큰 값)을 선택하는 방법의 차이입니다.

예를 들어서 설명드리면(가장 작은 값부터 가장 큰 값으로 정렬한다고 가정합시다.), 삽입 정렬에서는 첫번째 반복에서 가장 작은 값을 골라서 첫번째값으로 설정하는 방식입니다. 2 8 1 5 3 9 <- 1부터 9까지 한번 죽 스캔하면서 가장 작은 값을 찾습니다. '1'이지요. 이 값을 첫번째 값인 '2'와 바꿔 넣습니다.

1 8 2 5 3 9 <- 두번째 반복에서는 두번째 값인 8부터 끝 9까지 한번 죽 스캔하면서 가장 작은 값을 찾습니다. 그러면 '2'가 가장 작은 값이지요. 이 값을 두번째 반복의 첫번재 값인 '8'과 바꿔 넣습니다.

1 2 8 5 3 9 <- 세번째 반복에서는 세번재 값인 8부터 끝 9까지 같은 방법으로 가장 작은 값을 찾아서 세번째 반복의 첫번째 값과 바꿔 넣습니다.

이와 같은 방법으로 처음부터 끝가지 다 돌면 정렬이 완성됩니다. (각각의 반복때마다 전체를 [물론 1개식 덜 읽지만] 다 읽어야 하고 이 반복을 앞에서부터 끝가지 해야 합니다.)버블 정렬은 (1, n), (1, n-1), (1, n-2) ... ... (1, 2) 위치의 숫자를 반복해서 정렬하지요.
삽입 정렬은 각 반복 때마다 가장 작은 값을 찾아서 앞으로 넣어줍니다.
버블 정렬은 각 반복 때마다 가장 큰 값을 맨 뒤로 넣어줍니다.

하지만 두 정렬 모두 전체 정렬을 위해서 읽어야 되는 반복 작업의 개수는 동일합니다


소스보기

#include <stdio.h>
 
void Insert(char *ar, int num)
{
     int i,j;
     char temp;
 
     // 두 번째 요소부터 끝까지 순회
     for (i=1;i<num;i++)
   {
          // 앞쪽으로 이동하면서 자기보다 큰 값을 한칸씩 오른쪽으로 이동한다.
          for (temp=ar[i],j=i;j>0;j--)
      {
              if (ar[j-1> temp)
        {
                  ar[j]=ar[j-1];
              }
        else
          {
                   break;
              }
          }
          // 자기보다 크지 않은 최초의 칸 자리에 자신을 삽입한다.
          ar[j]=temp;
     }
}
 
int main()
{
     char str[]="45213";
 
     printf("정렬 전의 문자열 : %s\n",str);
     Insert(str,strlen(str));
     printf("정렬된 문자열 : %s\n",str);
}


 

'Daily Report' 카테고리의 다른 글

111101 RF reader TEST  (0) 2011.11.01
111031 Protocols for Reader Control  (0) 2011.10.31
111024 Socket 03  (0) 2011.10.24
111021 Game sokoban04  (0) 2011.10.21
111021 Socket02  (0) 2011.10.21