EBRF700 모듈은 시리얼통신을 통해 모듈의 모든 제어가 이루어 집니다.
기본적으로 패킷(packet) 단위로 통신을 합니다.
한 패킷의 구성은 아래와 같습니다.

STX : (02)hex

LENGTH
COMMAND와 DATA의 길이,COMMAND 길이는 항상 1이므로 'DATA길이 + 1' 과 같습니다.

COMMAND
Command 1바이트

DATA[n]
Data n바이트, 254≥n≥0, DATA가 없고 COMMAND만 있는 패킷도 있습니다. 이때 LENGTH는 COMMAND길이만 포함된 1입니다.

Checksum
STX를 제외한 모든 바이트(LENGTH + COMMAND + DATA[n])를 더한후 반전 시킨 값입니다. 1byte를 초과한 값이 무시합니다.
STX를 제외하고 Checksum까지 모두 더하면 항상 (FF)hex가 나옵니다.
* Checksum 계산시 반전은 c언어의 경우 ~를 사용하거나 또는 0xff에서 해당값을 빼도 됩니다.
checksum = (~sum); 또는 checksum = 0xff - sum;


EBRF700은 항상 수동적인 입장에 있습니다.
Host측에서 명령 한 패킷을 전송하면 그 명령에 따르는 동작을 하는 방식 입니다.
그리고 동작한 결과를 항상 return하게 되어 있습니다.
아래와 같습니다. PCD라고 하는것은 Proximity Coupling Device 약자로 카드리더모듈(EBRF700)이라 생각하시면 됩니다.


만약 HOST측에서 패킷을 전송할때 전송바이트 사이의 delay가 100ms 이상일 경우 EBRF700측에서는 TimeOut을 발생시켜 수신하던 패킷을 무시 합니다. 아래와 같습니다.

Host측에서는 다시 COMMAND패킷을 보내어 실행해야 합니다.

EBRF700에서는 수신된 패킷의 Checksum을 계산하여 Checksum이 틀릴 경우 checksum error Status 를 리턴하게 됩니다. 해당 커맨드패킷을 수행되지 않습니다.



위와 같은 방법으로 패킷통신을 하는 이유는 비신뢰성 통신인 시리얼통신에서의 데이타 신뢰성을 확보하기 위함 입니다.


c로 작성한 통신 예제 입니다.

* 인터럽트를 이용한 패킷수신 루틴
#define STX 0x02

byte Sbuf[256];
int  Scnt=0;
byte CheckSum=0,Sdata_length=0;
                  
seiral interrupt service routine()
{          
  Sbuf[Scnt]=getch(); // 1byte 수신
  if(Scnt==0 && Sbuf[Scnt]!=STX) { Scnt=(-1); }  //
  else if(Scnt==1) { Sdata_length=Sbuf[Scnt]; CheckSum=Sbuf[Scnt]; }
  else if(Scnt>1)
    {  if(Sdata_length==0)
         { CheckSum=(~CheckSum);
           if(CheckSum==Sbuf[Scnt]) //  checksum 확인
             {   
        /////////////////////////////////////////////////////////////     
                //한패킷 수신완료, Sbuf[]에 저장된 패킷 분석
        /////////////////////////////////////////////////////////////       
             }
           else // Check Sum ERROR..
             {   
             }
           Scnt=0xff;   //clear..
         }
       else  Sdata_length--;
       CheckSum+=Sbuf[Scnt];
    }
  Scnt++;
}


* 패킷 송신 루틴
void SendPacket(byte command, byte * ddata, byte data_length)

    byte checksum=0;
    byte length=0;
    byte n;

    length=data_length+1;   //data + cmd
    checksum=length+command;
    for(n=0;n<data_length;n++) checksum+=ddata[n];
    checksum=~checksum;  // invert..

    putch(STX); putch(length); putch(command);
    for(n=0;n<data_length;n++) putch(ddata[n]);
    putch(checksum);
}
Posted by E2BOX


티스토리 툴바