본문 바로가기
코스웨어/10년 시스템제어

6월 4일 보고서 17번 유성민

by 알 수 없는 사용자 2010. 6. 4.
728x90
반응형

<RFID>

1. LED 깜빡임, 소리내기
2. 4Hz로 8초간 빨간불이 깜박이고 초록불은 안켜진 상태에서 소리나기
3. 8Hz로  8초간 초록불 깜박이고, 빨간불은 켜둔다. 소리가 나도록한다.



일단 우리가 host에서 리더기로 파일을 보내게 되면

리더기에서 호스트에서 답변이 온다.

Status에서 값이 답변이 오는데 CRC코드는 앞에 4바이트에따라 바뀌고

Status값은 PDF 108쪽에 자세하게 설명이 되어있다.

내가 온 코드 값은  06 00 71 00 A7 A1라고 왔다.

여기서 00을 대해서 알아보면


제대로 보내었다면 4번째 자리에 00이라고 떠서 온다.

만약 다른 값이 온다면 무언가 잘못되었다고 왔을대는 state값이 변경되어서 온다.

간단한 예을 사진으로 보자

01, 02 ,03 04 에따라서

Data False

Write-Error

보고 리더기로 보냈을때  보낸 것에 대한 오류를 알수가 있다.



오늘 짠 소스 코드  0x71에 대한  CRC코드 접목  전체크기 호출 등

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

unsigned short MecCRC(void *arg) //CRC 함수  PDF16에 제공 
{
  unsigned short i;
  unsigned short j;
  unsigned short cnt;
  unsigned short crc=0xFFFF;

  unsigned char *buf = arg;

  cnt = (*buf) - 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;
}

int main()
{
  // RFID 리더기 시리얼 셋팅:1초간 LED 깜빡임, 소리 내기
  u_char  caString[] = {  
        0XFF, 0X000X710X000X3F, 
        0X000X000X000X0A, 0X00,
        0X00
        };
  
  int icnt;
  unsigned short ret;

  DWORD  dwWritten;    // 쓰기 후 실제 쓴 바이트 수 저장 공간
  DCB    SerialState;  // 시리얼 상태 저장
  HANDLE  hComm = CreateFile("COM3",GENERIC_READ | GENERIC_WRITE,0,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);
  caString[0]=sizeof(caString)+2//실제 배열크기 입력
  ret = MecCRC(caString);   //crc 코드 함수 호출 
  caString[caString[0]-2]=((unsigned char *)&ret)[0]; //crc 코드를 넣기.
  caString[caString[0]-1]=((unsigned char *)&ret)[1]; //crc 코드 넣기. 
  for(icnt=0; icnt<caString[0]; icnt++)  //배열 출력 
  {  
    printf("%d 0X%02X \n",icnt,caString[icnt]);
  }  

  if (INVALID_HANDLE_VALUE == hComm)
  {
    printf("포트 열 수 없음\n");
    return 0;
  }

  if(0 == SetupComm(hComm, 40963096)) //버퍼의 양 설정 
  {
    printf("버퍼 설정 에러\n");
    CloseHandle(hComm); //에러시 종료 
    return 0;
  }

  if(0 == PurgeComm(hComm, PURGE_TXABORT | PURGE_TXCLEAR)) //PURGE_TXABORT 초기기화시키는것임
  {
    printf("버퍼 초기화 에러\n");
    CloseHandle(hComm);
    return 0;
  }

  SerialState.DCBlength = sizeof(SerialState);

  if(0 == GetCommState(hComm, &SerialState))
  {
    printf("시리얼 상태 읽기 에러\n");
    CloseHandle(hComm);
    return 0;
  }

  SerialState.BaudRate  = CBR_38400;  // 속도
  SerialState.ByteSize  = 8;      // 바이트 크기
  SerialState.Parity    = EVENPARITY;  // 패리티
  SerialState.StopBits  = ONESTOPBIT;  // 스톱 비트

  if (0 == SetCommState(hComm, &SerialState))
  {
    printf("시리얼 상태 설정 에러\n");
    CloseHandle(hComm);
    return 0;
  }

  if (0 == WriteFile(hComm, caString, sizeof(caString)+2&dwWritten, 0))
  {
    printf("쓰기 에러\n");
  }
  
  else
  {
    printf("쓰기 성공\n");
  }

  dwWritten =6;
  if(ReadFile(hComm, caString, dwWritten, &dwWritten, 0)==1)
  {
    printf("읽기 성공\n");
    printf("받은 데이터 :\n");
    for(icnt=0;icnt<caString[0];icnt++)
    {
      printf("%d 0X%02X \n",icnt,caString[icnt]);
    }
  }
  
  printf("%02x %02x %02x %02x %02x\n", caString[0], caString[1], caString[2], caString[3], caString[4]);
  
  CloseHandle(hComm);

  return 0;
}


728x90