본문 바로가기
코스웨어/12년 내장형하드웨어

[RFID] - 정철

by 알 수 없는 사용자 2012. 10. 11.
728x90
반응형


main.c

#include <stdio.h>
#include <windows.h>

unsigned short Emb_Crc(void *);

int main()
{
  HANDLE hComm;
  int iCnt;
  char caString[] = "HI";
  unsigned char msg[] = {0x0D,0x00,0x71,0x00,0x1F,0x00,0x00,
              0x00,0x01,0x00,0x00,0xFF,0xFF};
  DWORD dwWrite;
  DWORD dwRead;
  
  DCB  sPS;    //시리얼 포트 삭제 및 저장 :: PORT STATUS이다.
  COMMTIMEOUTS cTime;

  unsigned char uc;
  
  hComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL,
      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  //COM3 쓰면 포트가 열린다. OPEN 존재하는가, FILE 일반적으로 연다)
  //COM포트에 관한 정보가 리턴되서 hComm에 저장된다.
  
  if(INVALID_HANDLE_VALUE == hComm)  //잘못 된 입력값
  {
    printf("PORT OPEN ERROR!!\n");
    return 0;
  }
  
  if(0 == SetupComm(hComm, 40964096))  //버퍼 설정
  {
    printf("BUFFER CONTROL ERROR!!\n");
    CloseHandle(hComm);
    return 0;
  }

  if(0 == PurgeComm(hComm, PURGE_TXABORT | PURGE_TXCLEAR))  //포트 초기화
  {
    printf("PORT INIT FAIL!!\n");
    CloseHandle(hComm);
    return 0;
  }

  sPS.DCBlength = sizeof(sPS);  //sPS안에 구조체 값 세팅
  
  if(0 == GetCommState(hComm, &sPS))  //COM1의 정보 변경
  {
    printf("PORT STATUS READING FAIL!!\n");
    CloseHandle(hComm);
    return 0;
  }
  /* 통신 설정 해준다. 38400, 8bit, 짝수패리티, 정지비트 1, 흐름제어 없음 */
  sPS.BaudRate = CBR_38400;
  sPS.ByteSize = 8;
  sPS.Parity = EVENPARITY;
  sPS.StopBits = ONESTOPBIT;    

  /* 변경한 값으로 세팅한다. (검사까지) */
  if(0 == SetCommState(hComm, &sPS)) 
  {
    printf("PORT STATUS WRITING FAIL!!\n");
    CloseHandle(hComm);
    return 0;
  }
  
  /* CRC값 */
  *((unsigned short *)(msg + 11)) = Emb_Crc(msg);

  /* 파일에 기록한다. (핸들, 주소, 사이즈) */
  WriteFile(hComm, msg, sizeof(msg), &dwWrite, 0);
  printf("%d\n", dwWrite);

  /* 파일핸들, 데스테네이션, 사이즈 */
  ReadFile(hComm, msg, 1&dwRead, 0);
  if(sizeof(msg) < msg[0])
  {
    msg[0= sizeof(msg) - 1;
  }
  ReadFile(hComm, msg+1, msg[0]-1&dwRead, 0);

  /* msg의 가장 앞에 전체 길이가 들어가 있다 */
  for(iCnt=0;iCnt<msg[0];++iCnt)
  {
    printf("%02X ", msg[iCnt]); 
  }
  putchar('\n');

  CloseHandle(hComm);

  return 0;
}

unsigned short Emb_Crc(void *arg)
{
  unsigned short i;
  unsigned short j;
  unsigned short cnt;
  unsigned short crc=0xFFFF;
  unsigned short temp;
  unsigned char *buf = arg;

  cnt = (*buf) - 2//CRC 계산하기 위해서 -2를 해준다.

  for(i=0 ; i < cnt ; ++i)
  {
    crc^= *(buf + i);
    for(j=0 ; j < 8 ; ++j)
    {
      if(0 != (crc&0x0001))
      {
        crc=(crc>>1)^0x8408;
      }
      else
      {
        crc=(crc>>1);
      }
    }
  }

  return crc;
}


728x90