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

[내장형]황세선_2011.11.02

by 알 수 없는 사용자 2011. 11. 3.
728x90
반응형
RFID 호스트 명령

RFID... 오늘은 RFID 모듈을 가지고 크게 두가지 기능을 배웠다.
첫번째는 리더기가 지원하는 태그 알아보기!
두번째는 RFID 카드(태그)의 번호 알아보기!

그럼 첫번째 부터 해보자. 첫번째 해보기에 앞서 우리와 리더기 와의 관계를 살펴보자.



참 어이 없는 그림이지만;; 이해해 주길 바랍니다. 그렇다. 위 그림은 대령 아저씨가 도토리를 들고 있는 요상한 짐승(다람쥐로 추정)에게 뭔가를 물어보고 있다. 그저 관등성명을 대라고 했을 뿐인데 저 짐승은 당황한 기색이 영력하다.
혹시 관등성명이 무엇인지 모르는 분들을 위해 잠깐 설명하자면 "이병 다람쥐!" 처럼 앞에 자신의 계급을 붙이고 뒤에 이름을 붙여 대답하는 것이다.
음..여기서 말하고자 하는것은 대령 아저씨는 host 로 명령 및 질문을 던질수 있다는 것이고 그것에 응하는 상대는 다람쥐 처럼 일반 적인 말로는 말이 통하지 않는다는 것이다. 으흠..그렇다고 다람쥐에게 국어를 가르칠 수도 없는 일! 그래서 우리의 대령님은 다람쥐 언어를 배우기로 했다는 슬픈 사연이...ㅠ

그럼 대령님과 함께 다람쥐 언어중 "자네 지원하는 태그가 무엇인가?" 라는 언어를 배워보자.



위 의 파란색 동그라미 부분이 바로 그 질문에 해당하는 부분이다. 실제로 이 질문은 태그 뿐 아니라 다른 정보도 포함 되지만 우리의 관심사는 오직 태그의 종류! 전체 적인 구조는 다들 아시고 있을 테니 생략하고 넘어 갑니다.;

드디어 우리는 다람쥐가 알아 듣는 말을 할 수 있게 되어 버렸다. 그러면 이에 다람쥐는 다음과 같이 응답해 올것이다.



역시 모국어 구사 능력을 과시하듯 꽤나 길다. 허나 그래 봤자다. 우리의 관심사는 무엇? 태그~ 그렇다. 태그 정보만 보면된다. 저 파란 동그라미가 바로 태그 부분. 바로 10번 비트 11번 비트다. 이 두 비트 중에서도 10번은 죄다 - 이거 이니 11번 비트만 보면된다. 11번을 보면 5가지 태그 종류가 눈에 띈다. 눈에 잘 띄게 녹색 원으로 칠해도 놨다.

자..이제 다람쥐와 주고 받을 수 있는 회화 하나 배웠으니 직접 소스로 활용해 보자. 먼저 질문을 작성하자.



질문 작성 완료. 다음 이 질문을 CRC 붙여서 write() 할 것이다. 그러면 응답이 오겠지? 응답이 오면 read() 할테고 read() 하면 분석 할테지.. 그렇다. 분석을 해보자. 소스는 아래와 같다.



소스를 훑어 보면 if 가 5개나 있고, cBuff[10] 을 가지고, & 비트 연산을 하고 있다. 여기서 잠깐 & 비트 연산은 한가지 특성이 있다. A 라는 값에 B 라는 값으로 & 연산을 하면 A 에 B 가 있는지 알수 있다. 그렇다. 이러한 특성이 있다. 이러한 기법은 임베디드 코드에 상당히 많이 쓰인다. 추가로 | 연산은 A 라는 값에 B 라는 값을 추가하기 위해 많이 쓰인다. 잘 이해가 안되면 공책에 A 랑 B를 적어 넣고 직접 & 혹은 | 를 해보면 알수 있다. 이러한 기법은 외워 둘만 하다고 생각한다.
다시 코드로 돌아가서 & 연산의 특성을 알았으니 이제 이해가 빠를 것이다. 딱 한가지만 예를 들어 보겠다. 만약 응답코드에 ISO 15693 이 포함 되어 있었다고 하자. 위 표를 참고해 0x08(4번째 비트) 를 B 라고 두고 A 를 11번 바이트라 고 보면 이를 & 시키면 0x08 이라는 값이 나올 것이다. 이것은 어떠한 의미냐? 바로 A 에 B 가 있었다는 말이고 여기서는 ISO 15693 을 지원 한다는 소리다.
이렇게 첫번째 회화 끝.
[내용 추가]

태그 출력 소스
 void Input_Incomming(int iPort)
{
  int iRet;
  int iCnt;

  // 최초 한번 읽어 1번 바이트의 크기를 알아 낸다.
  iRet = read(iPort, cBuff, sizeof(cBuff));
  // 그 크기 만큼 읽는다.
  while(cBuff[0] > iRet)
  {
    // iRet = iRet + read 바이트 순으로 계속 읽는다.
    iRet = iRet + read(iPort, &(cBuff[iRet]), sizeof(cBuff));
  }
  // 받은 데이터 헥사값 출력
  iCnt = 0;
  while(iRet > iCnt)
  {
    printf("%02X ", (unsigned char)*(cBuff + iCnt));
    ++iCnt;
    if(0 == (iCnt % 16))
    {
      putchar('\n');
    }
  }
  putchar('\n');
  putchar('\n');

  
  // 해석
  if(0 !=  (cBuff[10& 0x01))
  {
    printf("I-Code 1 supported\n");
  }
  if(0 !=  (cBuff[10& 0x02))
  {
    printf("Tag-it HF supported\n");
  }
  if(0 !=  (cBuff[10& 0x08))
  {
    printf("ISO 15693 supported\n");
  }
  if(0 !=  (cBuff[10& 0x40))
  {
    printf("I-Code EPC supported\n");
  }
  if(0 !=  (cBuff[10& 0x80))
  {
    printf("I-Code UID supported");
  }
}

실행 화면


이 출력 소스에는 아주 중요한 사실이 있다. 빨간색 소스 부분을 보면 while() 문을 돌면서 read 를 호출 하고 있는데 이것은 우리가 RFID 모듈이 주는 데이터를 수신하기 위해서 read 를 호출할때 read 를 한번 호출 한다고 해서 모든 데이터가 다 들어오는 것이 아니라는 것이다. 그래서 첫번째 read 에서 리더기가 보내는 데이터 크기를 알아 내고 이 데이터 크기만큼 계속 루프를 돌면서 값을 얻어 내는 것이다. 그렇게 해야 출력 결과가 위의 실행 화면 처럼 나오게 된다.

이번주 토요일은 ..

라고 즐겨보는 기상캐스터님이 말씀하셨다. @.@;;

으흠; 자..정신 차리고 다음 번째 회화를 배워보자. 다음 배워볼 회화는 바로 "자네 주변에 있는 카드 번호좀 불러 주게나." 다.
여기서 잠깐! 명령문이 등장했다. 위의 회화 에서는 단순 질문이었지만 이번엔 명령문! 젠장 문법이다. 단어 외우기 보다 더 싫은 문법.; 살펴보자.



1 번 2번 비트는 잘 아실 테고 3번 을 한번 보자. 3번은 호스트가 내리는 명령이라는 것을 뜻하고 값으로는 0xB0 가 들어간다. 그리고 뒤에 오는 4 부터 맨뒤에서 전전(n-2) 바이트 까지는 그 명령의 세부적인 내용이 들어간다. 음 역시 명령문이라 좀 어려워 보인다. 특히 4 바이트 부터 n-2 부분이;;

뭐.. 대충 넘어가자.(실은 이것 이상은 모름)
대충 명령문의 문법은 알았으니 이제 본격적으로 멋지게 "자네 주변에 있는 카드(태그) 번호좀 불러 주게나." 를 한번 외쳐 보자.

일단 4번 바이트에 들어갈 명령 내용은? 바로..
명령!
이 명령으로 말할것 같으면은 우리의 다람쥐 에게 주변에 태그가 붙은 카드(태그)를 스캔해서 그 카드(태그)의 번호를 알아 내라는 명령이다. 즉, "자네 주변에 있는 카드(태그) 번호좀 불러 주게나." 라는 내용이 담겨 있다.
그럼 다음 n-2 는? 일단 아래 그림을 보자.



이것은 요청 데이터 라고 부르며, 친절하게 4번 바이트 값과 n-2(5번) 에 대한 힌트가 나와 있다. 이 힌트를 가지고 아래를 처다보면?



윽.. 이것은 무엇인가. 힌트를 따라가 봤더니 으잌; 역시 힌트는 힌트인가 보다. CM 선생님 말씀으론 이건 0 을 주라고 하신다. 영어를 해석해 보아도 느낌이 잘 안온다.; 그냥 0을 쓰는가 보다 하고 넘어가야겠다.(죄송합니다;)

음음.. 좀 애매 했지만 일단 "자네 주변에 있는 카드(태그) 번호좀 불러 주게나." 라는 말은 할수 있게 된것 같다. 그렇다면 이제 우리의 귀염둥이 이병 다람쥐의 멋들어진 모국어 답변을 들을 시간. 아.. 이것도 해석해야되.; 그림을 보자.



일 단 총 3가지의 응답이 보인다. 그러나 역시 CM 선생님 말씀으론 맨위의 standard 문법을 쓴다고 하셨다. 그래서 저거만 보고 넘어가자. standard 응답 코드의 8 ~ 15 바이트 를 보면(파란색 동그라미) UID 라고 적혀있다. 그렇다. 이것이 바로 카드(태그)의 번호(태그 번호)다. 총 8바이트로 구성되어 있다. 이것은 2^(8*8) 으로 18446744073709551616 라는 숫자가 나온다고 계산기가 말해 주었다. 즉 저 만큼의 태그를 쓸수 있다는 말이다. 흐흠.. 상당히 큰 숫자다. 부끄럽지만 세지도 못하겠다.;;

자..그럼 대충 두번째 회화 용법도 익혀 봤으니 이제 이를 적용해 보자. 어디에? 소스 코드에!
먼저 명령이다.



역시나 이 명령은 CRC 가 붙을 테고, 이를 write 할테고, 우리의 다람쥐는 명령을 수행 할테고, 그리곤 그 결과를 보고 할테고, 우리는 read() 로 보고를 받을 테고, 이제 해석만 하면 되겠다.;



......................................................... 흑흑. 보고서는 집에서 쓰는 중이며, 집이라 당연히 RFID 수신 모듈이 없을테며, 수신 모듈 없으니 명령을 내려보지도 못할테며, 결과 그림도 못올릴 것이며..;; 죄송합니다. 내일 아침 테스트후 추가해 올리겠습니다.;; 잘 생각해 보면 첫번째 회화 내용도 결과 그림이 없다.;;
[추가]

UID 출력 소스
 위 소스에서 TR-TYPE 출력부분을 뺀 소스랑 동일;;;

실행 화면


간단 설명. 빨간 박스 카드 번호(태그 번호), 중간 결과는 카드(태그)가 없었을때, 잘보면 맨위의 카드(태그) 1과 맨 아래 카드(태그)2 의 번호가 틀린것을 알수 있다. 당연히 다른 카드(태그)니까 그렇다.

마무리.
죄송합니다.;;


[추가]



위는 키보드를 쳤을때 RFID 모듈로 데이터를 전송하는 부분의 소스...
728x90