모자라거나 잘 못된 부분은 코멘트를 남겨 주세요 잠이 와서리 오늘은 무리라 이만
안테나에서 칩으로 칩에서 PC로 통신 하는 프로그램
ARM 칩과 RFID 칩이 따로 있는 것이 일반적이지만, 우리가 쓰는 것은 패키징으로 감싸져 있는 경우이다.
RFID+안테나 = NFC라고 부른다. => 전송하는 방식이 조금 틀리다.
232시리얼 휴대폰짹 Dangle 동글 => 안에 칩같은 것이 들어 있는
gsm wcma 퀄퀌
지금 부터 우리가 해야 할것은 PC에서 특정 신호를 보내어 RFID를 작동시키다. 이 메세지를 Host Command라 한다.
5챕터 리터 컨트롤 규약 첫번째가, 5.1 에 보이는 속도를 측정한다.
<42페이지> 이 RFID는 같은 속도야만 응답이 있다. 이를 이용해서, 응답이 있을 때, 까지 속도를 변화해서 보낸다. 응답이 있으면, 해당하는 속도를 알수 있습니다.
스팩에서 보면 보내는 데이터와 받는 데이터가 같다. 는 것을 확인할 수 있다.
<44page>
5.4 Get Software version
MSG[3]이 0이면 에러 0이 아니면, 실행하고 상태정보를 MSG[10]~[11]에 저장한다.
출력 원리는
1, 해당하는 규약으로 세팅을 하면,
세부내용을 살펴 보면
SW-REV:
Revision status of the firmware. // 펌웨어의 버젼을 나타낸다.
D-REV:
Revision status of the development firmware. D-REV is set to ‘0’ in customized firmware revisions.
//개발자 펌웨어 버젼을 나타내고 D-REV 는 사용자 정의로 0으로 세팅되어 있다.
HW-Type:
Displays options which are supported by the Reader Hardware
//지원하는 리더 기기를 나타냄 ?
SW-TYPE:
Displays the type / model of the Reader
(see: ANNEX K: Codes of Reader Types)
//리더의 모델을 나타냄 ()안을 참조하라고 나오네요
TR-TYPE: 지원하는 테그를 나타낸다.
이를 코드로 나타내어 보자.
#include<windows.h>
#include<stdio.h>
#pragma comment(lib,"user32.lib")
#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 *arg);
int main()
{
unsigned char msg[128]={0x05,0x00,0x65
,0xff,0xff};
int iCnt = 0;
HANDLE hComm;
DWORD dwrite;
DWORD dread;
DCB sPS; //씨리얼 포트 상태저장
COMMTIMEOUTS cTime;
............... 네트워크 세팅 코드 .........................
*((unsigned short*)(msg+msg[0]-2)) = Emb_Crc(msg);
WriteFile(hComm,msg,msg[0],&dwrite,0);
//4번째 인자에 읽은 계수를 반환한다.(포인터로)주소를 적어 줘야한다.
ReadFile(hComm,msg,1,&dread,0);
ReadFile(hComm,msg+1,msg[0]-1,&dread,0);
if(0 != msg[3])
{
printf("에러남\n");
}
else
{
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 : [%]\n",(msg[10]&Tag_it_HF) ? "yes" : "no");
printf("\t\tI-Code 1 : [%s]\n",(msg[10]&I_Code_1) ? "yes" : "no");
}
CloseHandle(hComm);
return 0;
}
................ ..... 오류 검출 함수 ............
코드 설명 먼저, 세팅을 할 구조체의 값을 변경한다. 이때, 입력하는 정보는 5byte 이지만 돌아오는 정보는 로 늘어나 버린다. 정하지 않은 구조체 크기 를 128로 넉넉하게 늘려주자.
구조체 정보를 스팩에 맞게 세팅하여 주자.
그리고 Emb_Crc 함수로, 계산하여 오류 검출코드를 넣어 줘야 하는데, 이는 값이 변하변 수정해야 하므로 다음의 원리로 자동적으로, 넣어지게 된다.
msg + msg[0] -2 = msg[3]의 주소
변수 선언에 hComm 파라미터가 읽은 바이트의 수를 받을 변수의 포인터 DWORD dread; 를 선언해준다. WriteFile로 세팅된 자료를 보낸후 돌아오는 정보를 ReadFile로 받는다.
이때, 구조체 정보를 바꿀때 마다 길이가 달라 지므로 자동적으로 세팅 될 수 있게
다음 그림의 원리로 세팅한다.
먼저, 한byte를 읽는다. msg[0]은 읽었으므로 총길이를 알 수 있다.
이제 나머지를 읽는데 시점이 msg[1]부터 마지막 까지 이므로 (총길이 -1) 개를 읽어야 한다.
그리고 오류검사 코드의 결과가 status로 저장되고, 오류가 나면 해당하는 번호를 출력하는데, 이를 IF문으로 막아 노았다.
그리고 오류가 나질 않으면, 스팩의 표와 같은 자료가 되돌아 온다.
이를 스팩의 표에 해당하는 msg구조체를 출력 했다.
그리고,TR-TYPE은 태그의 종류로 지원하는 태그를 모두 표현 해야 하므로, 비트연산으로 해당하는 값을 축출하고, 조건 연산자를 이용해서 지원하는 여부를 출력했다.
조건 연산자, 수식 ? 참 : 거짓 으로 수식이 참이면 : 왼쪽의 것을 거짓이면 : 오른쪽의 것을 선택한다. 여기서 %s로 표현하므로 ""문자열 주소를 적어 노았다.
---- 출력 결과 ----
5.6으로 rf를 리셋하는 규약이다. 확인은 불가 하지만, 나중에 코딩을 해줘야 한다.
잠깐 살펴보면, 리더로 기본적인 자료, 길이, 모드번호, 장치번호, crc를 보내면,
상태정보인 status를 추가해서 돌아 온다.
5.7 다음은 안테나 ON/OFF 하는 규약으로 스팩을 보면 4번에 우리가 세팅할 rf를 통해
RF ON/OFF를 할 수 있다 내용을 보면,
RF에 0 이면 OFF 1이면, ON이 되고, 결과가 4번(STATUS)으로 에러가 없으면 0 있으면 헤당하는 오류 번호를 출력한다. 이는 <108page>를 참고 하자.
우리는 리더기를 컨트롤 해서 확인 할 수 있는 코드를 짜서 확인해 보도록 하자.
자, 이제 6. Host Commands로 넘어가자 6.1의 [0xB0]라는 장치 번호가 보인다.
<51PAGE> 다음을 보면, 표가 나오는데, 왼쪽의 명령을 오른쪽위의 태그가 동작
하는가를 표시 하였다.
우리 카드인 ISO 15693이 보인다.
<52PAGE>를 보면, 우리가 코드해야 할 규칙이 보인다. 1~3번 까지는 기존의 설명으로 스팩에도 나와 있질 않다. 문제는 길이가 n으로 가변적이라는 것이다.
그리고, 우리가 사용할 명령이나 MODE를 세팅해주야 하는 곳이 4번 부터 가변적이다.
이렇게 보내어지면, 바로 밑의 표처럼 1~4까지는 같고, 5번 부터 요청한 카드의 데이터를 보내어 진다. 다음 page를 보자.
< 53PAGE > 를 보면, 우리가 코딩할 명령 Inventory 가 나와 있는데 4번에 이 명령 번호를 넣어 줘야 한다고 표에 나와있다. [0x01]
다음 밑의 그림은 (파란색)은 우리가 요청한 데이터가 read되어 되돌아 오는데, 그림에서 보듯, 세가지로 가변적인데 이는 각 태그의 형마다, 길이가 가변적이라는 것이다.
standard 는 17byte, I-Code EPC는 16(20)byte, I-Code UID는 27byte로 다르다 이를 이용하여 우리의 태그의 종류를 알아보자.
그리고 5번에 7번 bit에 mode를 세팅하는데 설명을 보면,
(이진수 비트)b0 새로운 카드를 읽는다.
(이진수 비트)b1 기존의 카드에서 더 자료를 읽는다.
우리의 태그가 standard는 것을 알았다, 이릉 이용해서 안에 있는 정보를 표현해 보자,
내용을 살펴보면,
DATA-SETS : 리더기중 1이상의 테그를 읽을 수있는데, 이를 출력하는 것으로 우리 태그는 1의 태그만 읽을 수 있다.
TYPE_NO : 테그의 타입을 알 수 있는 것으로, 표를 살펴 보면,
RF_TEC
RFID의 전송 방식을 표현하는데
b00 이면 13.56mhz 전송 방식
b10 이면 UHF전송 방식
TYPE_NO
태그의 제조사를 출력하는데 그 값에 대한 제조사는 <103PAGE>를 참고 하라고 나와 있습니다.
......헤더 파일 ......
#define Philips_I_Code_1 0
#define Texas_Instruments_Tag_it_HF 1
#define ISO15693_Tags 3
#define Philips_I_Code_EPC 6
#define Philips_I_Code_UID 7
int main()
{
unsigned char msg[128]={0x07,0x00,0xB0
,0x01,0x00
,};//, 나머지는 0으로 초기화
.................변수 선언 시리얼 통신 설정 .........
................ 시리얼 통신 닫기...... 오류 검출 함수 ............
|
103 ANNEX
필립스가 유명
DSFID: 제조사 번호 안쓰면 0x00으로 세팅 되어 있습니다.
UID : 태그의 번호를 알 수 있습니다. 이를 이용해서 태그를 구분 할 수있습니다
'코스웨어 > 12년 내장형하드웨어' 카테고리의 다른 글
[리눅스커널] 요약입니다@@ (1) | 2012.10.12 |
---|---|
[리눅스 커널]2012/10/12 작업일지(sprintf의 역활) - by. 이창현 (3) | 2012.10.12 |
[리눅스커널] 시스템 호출 과정과 제작 (1) | 2012.10.12 |
[리눅스 커널] 2.4.32 와 2.6.14 소스 (0) | 2012.10.12 |
[공유기]DNS 서버가 응답하지 않습니다.란 메세지 뜰시 (2) | 2012.10.11 |
제안 한가지 하겠습니다. (9) | 2012.10.11 |
[RFID] 10.11 업무일지 - 정철 (2) | 2012.10.11 |
[RFID]10월 11 일 수업 (5) | 2012.10.11 |