<PC와 RFID 리더기가 통신하는 모습>
우리가 할 것은 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
}
================================================================================================================================================
<카드(칩) 종류>
(앞) (뒤)
(앞) (뒤)
'코스웨어 > 12년 내장형하드웨어' 카테고리의 다른 글
[RFID]스팩위주 설명 보완중 -김동기 (4) | 2012.10.11 |
---|---|
[공유기]DNS 서버가 응답하지 않습니다.란 메세지 뜰시 (2) | 2012.10.11 |
제안 한가지 하겠습니다. (9) | 2012.10.11 |
[RFID] 10.11 업무일지 - 정철 (2) | 2012.10.11 |
Visual Studio 에서 사용 팁. 나름 유용하니 애용하시오. (4) | 2012.10.11 |
[RFID] - 정철 (0) | 2012.10.11 |
10월 10일 - 리눅스 커널 프로그래밍 chater[3] -(4), 공유폴더에 kernel 옮기기 (8) | 2012.10.11 |
[리눅스 커널]linux 2.4 & linux 2.6 소스인사이드 설정 (10) | 2012.10.10 |