본문 바로가기
코스웨어/15년 스마트컨트롤러

20151213 수업 / RFID - 남수진

by 알 수 없는 사용자 2015. 12. 13.
728x90
반응형

 

  • 리더기에서 UID를 읽어서 수신된 UID에 해당하는 사진을 윈도우에 출력한다
    • 리더기 요청 신호는 버튼이나 타이머를 활용하여 보낸다
  • 구조체를 만들어 UIC의 정보를 저장하여 해당 리더기가 들어오면 정보가 출력되게 한다
    • 구조체에 이름, UID, 사진같은 정보를 저장
  • 카드를 갖다대면 문이 열리는 도어락 시스템을 만들 수도 있다

 

  • 카드 메모리의 데이터 읽고 쓰기

Image

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

#define CRC_POLYNOM     0x8408
#define CRC_PRESET          0xFFFF

void ControlRFID(HANDLE hComm, u_char * caComm);
void WriteRFID(HANDLE hComm, u_char * caWrite, unsigned int uiData);
unsigned int ReadRFID(HANDLE hComm, u_char * caRead);
unsigned short CRC16(void * vpData, unsigned int uiLen);

int main(void)
{
    u_char caLed[100]         = {0x0D, 0, 0x71, 0x00, 0x0F, 0x00, 0, 0, 0x0A, 0, 0};
    u_char caGetInfo[100]     = {0x07, 0, 0xB0, 0x01, 0x00, 0x00, 0, 0, 0x0A, 0, 0};
    u_char caRead[100]     = {0x09, 0, 0xB0, 0x23, 0x00, 0x03, 1, };
    u_char caWrite[100]     = {0x0E, 0, 0xB0, 0x24, 0x00, 0x03, 1, 4, 0xFF, 0xEE, 0xDD, 0xCC};
    int iCnt;
    unsigned int uiData;
    DWORD dwCnt;
    DCB sPState;
    u_char ucTmp;
   
    // 1. 시리얼 포트 열기
    HANDLE hComm = CreateFile("COM2"        // 포트 이름
        , GENERIC_READ|GENERIC_WRITE        // RW가능
        , 0
        , NULL
        , OPEN_EXISTING
        , FILE_ATTRIBUTE_NORMAL
        , 0);
    if(INVALID_HANDLE_VALUE == hComm)
    {
        printf("포트 열 수 없음\n");
        return 0;
    }
    // 2. Read버퍼와 write 버퍼 길이 설정
    if( 0 == SetupComm(hComm, 4096, 4096))
    {
        printf("버퍼 설정 에러\n");
        CloseHandle(hComm);
        return 0;
    }
    // 3. 버퍼 초기화
    if(0 == PurgeComm(hComm, PURGE_TXABORT|PURGE_TXCLEAR))   
    {
        printf("버퍼 초기화 에러\n");
        CloseHandle(hComm);
        return 0;
    }
    sPState.DCBlength = sizeof(sPState);
    // 4. 현재 시리얼 세팅을 읽어온다
    if( 0 == GetCommState(hComm, &sPState))
    {
        printf("시리얼 상태 읽기 에러\n");
        CloseHandle(hComm);
        return 0;
    }
    // 5. 시리얼 설정
    sPState.BaudRate = CBR_38400;
    sPState.ByteSize = 8;
    sPState.Parity = EVENPARITY;
    sPState.StopBits = ONESTOPBIT;
    // 6. 시리얼 세팅 적용
    if(0 == SetCommState(hComm, &sPState))
    {
        printf("시리얼 상태 설정 에러\n");
        CloseHandle(hComm);
        return 0;
    }
    ReadRFID(hComm, caRead);

    putchar('\n');
    printf("Input Number(hexa): ");
    scanf("%X", &uiData);
    putchar('\n');
       
    //ControlRFID(hComm, caLed);
    WriteRFID(hComm, caWrite, uiData);
    ReadRFID(hComm, caRead);
   
    CloseHandle(hComm);
    return 0;
}

void ControlRFID(HANDLE hComm, u_char * caComm)
{
    DWORD dwCnt;
    unsigned char caRecv[100];
    int iCnt;
   
    // 7. CRC값 대입
    *((unsigned short *)(caComm + caComm[0] -2)) = CRC16(caComm, caComm[0]-2);
    // 8. 시리얼 통신
    WriteFile(hComm, caComm, caComm[0], &dwCnt, 0);
    ReadFile(hComm, caRecv, 1, &dwCnt, 0);
    ReadFile(hComm, caRecv+1, caRecv[0]-1, &dwCnt, 0);

    printf("return: ");

    for(iCnt = 0; iCnt<caRecv[0]; iCnt++)
    {
        printf("%02X ", caRecv[iCnt]);
    }
    putchar('\n');
}

void WriteRFID(HANDLE hComm, u_char * caWrite, unsigned int uiData)
{
    DWORD dwCnt;
    unsigned char caRecv[100];
    int iCnt;

    *((unsigned int *)(caWrite+8)) = uiData;
   
    // 7. CRC값 대입
    *((unsigned short *)(caWrite + caWrite[0] -2)) = CRC16(caWrite, caWrite[0]-2);
    // 8. 시리얼 통신
    WriteFile(hComm, caWrite, caWrite[0], &dwCnt, 0);
    ReadFile(hComm, caRecv, 1, &dwCnt, 0);
    ReadFile(hComm, caRecv+1, caRecv[0]-1, &dwCnt, 0);

    printf("Write [%08X]  -> return: ", uiData);

    for(iCnt = 0; iCnt<caRecv[0]; iCnt++)
    {
        printf("%02X ", caRecv[iCnt]);
    }
    putchar('\n');
}
 
unsigned int ReadRFID(HANDLE hComm, u_char * caRead)
{
    DWORD dwCnt;
    unsigned char caRecv[100];
    int iCnt;
   
    // 7. CRC값 대입
    *((unsigned short *)(caRead + caRead[0] -2)) = CRC16(caRead, caRead[0]-2);
    // 8. 시리얼 통신
    WriteFile(hComm, caRead, caRead[0], &dwCnt, 0);
    ReadFile(hComm, caRecv, 1, &dwCnt, 0);
    ReadFile(hComm, caRecv+1, caRecv[0]-1, &dwCnt, 0);

    printf("Read  [%08X]  -> return: ", *((unsigned int *)(caRecv + 7)));

    for(iCnt = 0; iCnt<caRecv[0]; iCnt++)
    {
        printf("%02X ", caRecv[iCnt]);
    }
    putchar('\n');

    return *((unsigned int *)(caRecv + 7));
}

unsigned short CRC16(void * vpData, unsigned int uiLen)
{
    int i, j;
    unsigned short crc = CRC_PRESET;
    unsigned char * DATA = vpData;

    for (i = 0; i < uiLen; i++)
    {
        crc ^= DATA[i];
        for (j = 0; j < 8; j++)
        {
            if (crc & 0x0001)
                crc = (crc >> 1) ^ CRC_POLYNOM;
            else
                crc = (crc >> 1);
        }
    }

    return crc;
}

 

 

  • 리더기에 입력된 카드에 따라 윈도우에 비트맵 이미지 출력 

 

Image

728x90