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

[RFID]10월 11 일 수업

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

<PCRFID 리더기가 통신하는 모습>

우리가 할 것은 RFID 통신규약[ISO 15693]에 의거하여 RFID리더기를 이용, 카드의 정보를 읽고 쓰는 소스를 만들면 된다.

 

<RFID 리더기 상태 설정 소스>

#include <windows.h>

#include <stdio.h>

 

unsigned short Emb_Crc(void *);

 

int main()

{

    HANDLE hComm;

    DWORD dw_write;

    DWORD dw_read;

    DCB sPS;    // 시리얼 포트 상태 저장

    int iCnt;

    unsigned char msg[] = {0x0D,     // 전체 바이트 숫자: 13

                            0x00,    // COM-Adr(장치번호)

                            0x71,    // [0x71]

                            0x00,0x30, // OS(스피커만 on, LED는 off)

                            0x00,0x00, // OSF(1Hz)

                            0x00,0x0A, // OS-Time(1초)

                            0x00,0x00, // 0x00

                            0xFF,0xFF // CRC 16

                            }; // P.48

    

    hComm = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,

                OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);

    // open함수와 비슷(COM1,읽고 쓰기,0,NULL,존재 할 때,일반적인 형태,0)

    // COM포트에 관한 정보가 리턴되서 hComm에 저장된다.

    

    if(hComm == INVALID_HANDLE_VALUE)    // 파일에러시

    {

        printf("포트를 열 수 없습니다.\n");

        return 0;

    }

 

    if(0 == SetupComm(hComm,4096,4096)) // 버퍼 설정

    {

        printf("버퍼 설정이 잘못되었습니다.\n");

        CloseHandle(hComm);

        return 0;

    }

 

    if(0 == PurgeComm(hComm,PURGE_TXABORT|PURGE_TXCLEAR))    // 포트 초기화

    {

        printf("포트 초기화에 실패했습니다.\n");

        CloseHandle(hComm);

        return 0;

    }

 

    sPS.DCBlength = sizeof(sPS);    // 포트값 설정(속도)

 

    if(0 == GetCommState(hComm,&sPS))    // 포트 상태 읽기

    {

        printf("포트 상태 읽기 에러!\n");

        CloseHandle(hComm);

        return 0;

    }

    /************* 우리가 쓸 포트 상태**************/

    sPS.BaudRate = CBR_38400;    // 전송속도 38400

    sPS.ByteSize = 8;        // 전송비트 8bit

    sPS.Parity = EVENPARITY;    // 짝수

    sPS.StopBits = ONESTOPBIT;    // 정지비트 1bit

    /***********************************************/

 

    if(0 == SetCommState(hComm,&sPS))    // 포트 상태 쓰기

    {

        printf("포트 상태 쓰기 에러!\n");

        CloseHandle(hComm);

        return 0;

    }

 

    *((unsigned short *)(msg+11)) = Emb_Crc(msg);

 

    WriteFile(hComm,msg,sizeof(msg),&dw_write,0);

    // write()함수와 비슷한데, dw_write에쓴 갯수를 반환한다.

    ReadFile(hComm,msg,1,&dw_read,0);

    // read()함수와 비슷한데, dw_read에읽은 갯수를 반환한다.

 

    if(sizeof(msg) < msg[0])

    {

        msg[0] = sizeof(msg) - 1;

    }

 

    ReadFile(hComm,msg+1,msg[0]-1,&dw_read,0);

 

    for(iCnt = 0 ; iCnt < msg[0]; ++iCnt)    // msg[0]는 리더기에서 읽어온 데이터의 크기를 가지고 있다.

    {

        printf("%02x ", msg[iCnt]);

    }

    putchar('\n');

 

    printf("포트가열렸습니다.\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;

 

    for(i=0 ; i < cnt ; ++i) // 제일끝의 2byte를 제외한 나머지까지

    {

        crc^= *(buf + i);

        for(j=0 ; j < 8 ; ++j)

        {

            if(0 != (crc&0x0001))

            {

             crc=(crc>>1)^0x8408;

            }

             else

            {

                  crc=(crc>>1);

            }

        }    

    }

    return crc;    // 카드정보를 return

}

================================================================================================================================================

<RFID 리더기 S/W정보를 볼 수 있는 소스>

#include <windows.h>

#include <stdio.h>

 

/****** TR-TYPE 값들******/

#define I_Code_1 0

#define Tag_it_HF 1

#define ISO_15693 3

#define I_Code_EPC 6

#define I_Code_UID 7

/**************************/

 

unsigned short Emb_Crc(void *);

 

 

int main()

{

    HANDLE hComm;

    DWORD dw_write;

    DWORD dw_read;

    DCB sPS;    // 시리얼 포트 상태 저장

    int iCnt;

    unsigned char msg[128] = {0x05,     // 보낼 바이트 숫자: 5

                            0x00,    // COM-Adr(장치번호)

                            0x65,    // [0x65] Get Software Version

                            0xFF,0xFF // CRC 16

                            }; // 명령어가 얼마나 올지 모르기 때문에 128로 선언[P.44]

    

    hComm = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,

                OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);

    // open함수와 비슷(COM1 ,읽고 쓰기,0,NULL,존재 할 때,일반적인 형태,0)

    

    if(hComm == INVALID_HANDLE_VALUE)    // 파일 에러시

    {

        printf("포트를 열 수 없습니다.\n");

        return 0;

    }

 

    if(0 == SetupComm(hComm,4096,4096)) // 버퍼 설정

    {

        printf("버퍼 설정이 잘못되었습니다.\n");

        CloseHandle(hComm);

        return 0;

    }

 

    if(0 == PurgeComm(hComm,PURGE_TXABORT|PURGE_TXCLEAR))    // 포트 초기화

    {

        printf("포트 초기화에 실패했습니다.\n");

        CloseHandle(hComm);

        return 0;

    }

 

    sPS.DCBlength = sizeof(sPS);    // 포트값설정(속도)

 

    if(0 == GetCommState(hComm,&sPS))    // 포트 상태 읽기

    {

        printf("포트 상태 읽기 에러!\n");

        CloseHandle(hComm);

        return 0;

    }

    /************* 우리가쓸포트상태**************/

    sPS.BaudRate = CBR_38400;    // 전송속도 38400

    sPS.ByteSize = 8;        // 전송비트 8bit

    sPS.Parity = EVENPARITY;    // 짝수

    sPS.StopBits = ONESTOPBIT;    // 정지비트 1bit

 

    if(0 == SetCommState(hComm,&sPS))    // 포트 상태 쓰기

    {

        printf("포트 상태 쓰기 에러!\n");

        CloseHandle(hComm);

        return 0;

    }

 

    *((unsigned short *)(msg + msg[0] - 2)) = Emb_Crc(msg);    // crc 위치(3bit)로 옮긴다.

 

    WriteFile(hComm, msg, msg[0], &dw_write, 0);

    // write()함수와 비슷한데, dw_write에 쓴 개수를 반환한다.

    ReadFile(hComm, msg, 1, &dw_read, 0);

    // read()함수와 비슷한데, dw_read에 읽은 개수를 반환한다.

    ReadFile(hComm, msg+1, msg[0]-1, &dw_read, 0);

    

    if(0 != msg[3]) // Status 상태가 0이 아니면 에러

    {

        printf("Error\n");

        return 0;

    }

    printf("Revision status of the firmware : %02X%02X\n", msg[4], msg[5]);

    printf("Revision status of the development firmware : %02X\n", msg[6]);

    printf("HW-Type : %02X\n", msg[7]);

    printf("SW-TYPE : %02X\n", msg[8]);

    printf("Support Transponders : \n");        // 지원하는 카드(칩) 종류

    printf("\t\tI-Code UID : [%s]\n", (msg[10]&I_Code_UID) ? "yes" : "no");

    printf("\t\tI-Code EPC : [%s]\n", (msg[10]&I_Code_EPC) ? "yes" : "no");

    printf("\t\tISO 15693 : [%s]\n", (msg[10]&ISO_15693) ? "yes" : "no");

    printf("\t\tTag-it HF : [%s]\n", (msg[10]&Tag_it_HF) ? "yes" : "no");

    printf("\t\tI-Code 1 : [%s]\n", (msg[10]&I_Code_1) ? "yes" : "no");

 

    printf("포트가 열렸습니다.\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;

 

    for(i=0 ; i < cnt ; ++i) // 제일 끝의 2byte를 제외한 나머지까지

    {

        crc^= *(buf + i);

        for(j=0 ; j < 8 ; ++j)

        {

            if(0 != (crc&0x0001))

            {

             crc=(crc>>1)^0x8408;

            }

             else

            {

                  crc=(crc>>1);

            }

        }    

    }

    return crc;    // 카드정보를 return

}

================================================================================================================================================

<RFID 리더기에 올려진 카드의 정보를 보는 소스> - 수정중

#include <windows.h>

#include <stdio.h>

 

/****** TYPE_NO 값들[P.103] ******/

#define Philips_I_Code_1 0x00

#define Texas_Instruments_Tag_it_HF 0x01

#define ISO15693_Tags 0x03

#define Philips_I_Code_EPC 0x06

#define Philips_I_Code_UID 0x07

/*********************************/

 

unsigned short Emb_Crc(void *);

 

 

int main()

{

    HANDLE hComm;

    DWORD dw_write;

    DWORD dw_read;

    DCB sPS;    // 시리얼 포트 상태 저장

    int iCnt;

    unsigned char msg[128] = {0x07,     // 보낼 바이트 숫자: 7

                            0x00,    // COM-Adr(장치번호)

                            0xB0,    // [0xB0] Get Software Version

                            0x01,    // REQUEST-DATA

                            0x00,    // 새로운 카드의 데이터를 읽는 모드

                            //0        // CRC 16

                            }; // 명령어가 얼마나 올지 모르기 때문에 128로 선언[P.52~53]

    

    hComm = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,

                OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);

    // open함수와비슷(COM1,읽고 쓰기,0,NULL,존재 할 때,일반적인 형태,0)

    

    if(hComm == INVALID_HANDLE_VALUE)    // 파일 에러시

    {

        printf("포트를 열 수 없습니다.\n");

        return 0;

    }

 

    if(0 == SetupComm(hComm,4096,4096)) // 버퍼 설정

    {

        printf("버퍼 설정이 잘못되었습니다.\n");

        CloseHandle(hComm);

        return 0;

    }

 

    if(0 == PurgeComm(hComm,PURGE_TXABORT|PURGE_TXCLEAR))    // 포트 초기화

    {

        printf("포트 초기화에 실패했습니다.\n");

        CloseHandle(hComm);

        return 0;

    }

 

    sPS.DCBlength = sizeof(sPS);    // 포트값 설정(속도)

 

    if(0 == GetCommState(hComm,&sPS))    // 포트 상태 읽기

    {

        printf("포트 상태 읽기 에러!\n");

        CloseHandle(hComm);

        return 0;

    }

    /************* 우리가 쓸 포트 상태**************/

    sPS.BaudRate = CBR_38400;    // 전송속도 38400

    sPS.ByteSize = 8;        // 전송비트 8bit

    sPS.Parity = EVENPARITY;    // 짝수

    sPS.StopBits = ONESTOPBIT;    // 정지비트 1bit

 

    if(0 == SetCommState(hComm,&sPS))    // 포트 상태 쓰기

    {

        printf("포트상태쓰기에러!\n");

        CloseHandle(hComm);

        return 0;

    }

 

    *((unsigned short *)(msg + msg[0] - 2)) = Emb_Crc(msg);    // crc 위치(3bit)로 옮긴다.

 

    WriteFile(hComm, msg, msg[0], &dw_write, 0);

    // write()함수와 비슷한데, dw_write에 쓴 개수를 반환한다.

    ReadFile(hComm, msg, 1, &dw_read, 0);

    // read()함수와 비슷한데, dw_read에 읽은 갯수를 반환한다.

    ReadFile(hComm, msg+1, msg[0]-1, &dw_read, 0);

    

    if(0 != msg[3]) // Status 상태가 0이 아니면 에러

    {

        printf("No Transport\n");

        return 0;

    }

    

    printf("Tag Data : "); // 카드 종류 출력[P.53]

    switch(msg[0])

    {

        case 17:

            printf("[Standard]\n");

            break;

        case 16:

        case 20:

            printf("[I-Code EPC]\n");

            break;

        case 27:

            printf("[I-Code UID]\n");

            break;

        default:

            printf("[Transport Error]\n");

            return 0;

    }

 

    printf("RF Type : [%s]\n", (msg[5]&0xC0 ? "[UHF Transponder]" : "[13.56MHz Transponder]"));

    printf("Vendor : ");

    switch(msg[5] & 0x0F)    // TYPE_NO 출력[P.54] -> ANNEX 참조[P.103]

    {

        case Philips_I_Code_1:

            printf("[Philips I-Code 1]\n");

            break;

        case Texas_Instruments_Tag_it_HF:

            printf("[Texas Instruments Tag-it HF]\n");

            break;

        case ISO15693_Tags:

            printf("[ISO15693 Tags]\n");

            break;

        case Philips_I_Code_EPC:

            printf("[Philips I-Code EPC]\n");

            break;

        case Philips_I_Code_UID:

            printf("[Philips I-Code UID]\n");

            break;

        default:

            printf("[Unknown Vendor]\n");

            return 0;

    }

    printf("포트가 열렸습니다.\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;

 

    for(i=0 ; i < cnt ; ++i) // 제일 끝의 2byte를 제외한 나머지까지

    {

        crc^= *(buf + i);

        for(j=0 ; j < 8 ; ++j)

        {

            if(0 != (crc&0x0001))

            {

             crc=(crc>>1)^0x8408;

            }

             else

            {

                  crc=(crc>>1);

            }

        }    

    }

    return crc;    // 카드정보를 return

}

================================================================================================================================================

 

<카드(칩) 종류>

(앞) (뒤)

(앞) (뒤)

728x90