※ 트랜스폰더 내에 메모리 값을 블록단위로 가져옴


#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <termios.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/signal.h>
#define SPEED B38400 #define SPORT "/dev/ttyS1" //Serial Port2
unsigned short CRC16(unsigned char *, unsigned int); void Handle_Serial_Sig(int);
volatile int iBreak = 0;
int main() { char cBuff[255]; //수신용 버퍼 int iDev = 0; //장치 데스크립션 int iRet = 0; //반환값 int iCnt; unsigned char ucTemp; struct termios stOldState; // 기존 Serial Port 상태 정보 struct termios stNewState; // 새로운 Serial Port 상태 정보 struct sigaction stSigAct; // 시그널 액션 설정
//unsigned char ucRecvBuff[255]; unsigned char Buff[255] = { /* [0xB0] Host commands for ISO15693 Mandatory and Optional Commands*///-------------- 0x11, //[0x23] Read Multiple Blocks 0x00, 0xB0, 0x23, 0x01, //<- Address Mode 0xE0, //<- UID 0x04, 0x01, 0x00, 0x03, 0x0F, 0x3B, 0x70,
0x00, // DB-ADR
0x02, // DB-N (BLOCK 수) // 원하는 블록 주소(위치,DB-ADR)에서 DB-N (BLOCK 수) 만큼 DB를 리턴을 받겠다는 REQUEST /* 0x07, //[0x01] Inventory 0x00, 0xB0, 0x01, 0x00, */ //----------------------------------------------------- /* 0x05, // Get Software Version 0x00, 0x65, */ /* 0x06, // Baud Rate Detection 0x00, 0x52, 0x00, */
/* 0x0D, // Set Output 0x00, 0x71, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, */
/* 0x0D, // Set Output2 0x00, 0x71, 0x00, 0x3F, 0x00, 0x07, 0x00, 0x0A, 0x00, 0x00, */
0xFF, 0xFF }; iDev = open(SPORT, O_RDWR | O_NOCTTY | O_NONBLOCK);// Serial Port Open
if( 0 > iDev) //시리얼 포트 Open Error { perror(SPORT); exit(-100); } //시리얼 포트 설정 전에 시그널 핸들러 등록 bzero(&stSigAct, sizeof(stSigAct)); stSigAct.sa_handler = Handle_Serial_Sig; sigaction(SIGIO, &stSigAct, NULL);
//SIGIO signal 을 수신하도록 설정 fcntl(iDev, F_SETOWN, getpid());//iDev(시리얼 포트) 소유자를 현재 프로세스로 바꿈 // SIGIO 발생은 소유자에게 알려지기 때문에...
// file descriptor를 비동기로 설정 fcntl(iDev, F_SETFL, FASYNC);
tcgetattr(iDev, &stOldState); // 현재 Serial Port 상태 저장 (백업해둠) bzero(&stNewState, sizeof(stNewState)); // 구조체 초기화
stNewState.c_cflag = SPEED | CRTSCTS | CS8 | CLOCAL | CREAD | PARENB;
stNewState.c_iflag = IGNPAR | ICRNL ; stNewState.c_oflag = 0; // 수신된 데이터를 그대로 출력
//stNewState.c_lflag = ICANON; //Canonical 통신 기법 사용 stNewState.c_lflag = 0; //Non-Canonical 통신 기법 사용 stNewState.c_cc[VMIN] = 1; //read시 리턴되기 위한 최소 문자 개수 지정 stNewState.c_cc[VTIME] = 0;
tcflush (iDev, TCIFLUSH); // 시리얼 포트수신 큐 초기화 tcsetattr(iDev, TCSANOW, &stNewState); //시리얼 포트에 새 속성 적용
*((unsigned short *)(&Buff[Buff[0]-2])) = CRC16(Buff, Buff[0]-2);
/* printf("%02X\n", Buff[0] ); printf("%02X\n", Buff[1] ); printf("%02X\n", Buff[2] ); printf("%02X\n", Buff[3] ); printf("%02X\n", Buff[4] ); printf("%02X\n", Buff[5] ); printf("%02X\n", Buff[6] ); printf("%02X\n", Buff[7] ); printf("%02X\n", Buff[8] ); printf("%02X\n", Buff[9] ); printf("%02X\n", Buff[10] ); printf("%02X\n", Buff[11] ); printf("%02X\n", Buff[12] ); */
write(iDev, Buff, Buff[0]); //송신 read(iDev, Buff, sizeof(Buff)); //수신
//Buff[0] = 13; for(iCnt = 0; iCnt < Buff[0]; ++iCnt) { printf("%02X ", Buff[iCnt]); } putchar('\n');

/* //[0x01] Inventory------------------------ printf("__TR-TYPE__\n"); printf("RF_TEC : "); if(0 != (Buff[5] & 0x80) ) { printf("[UHF Transponder]\n"); } else { printf("[13,56 MHz Transponder]\n"); } printf("TYPE_NO : "); if(0x00 == (Buff[5] & 0x0F) ) { printf("[Philips I-Code 1]\n"); } else if(0x01 == (Buff[5] & 0x0F) ) { printf("[Texas Instruments Tag-it HF]\n"); } else if(0x03 == (Buff[5] & 0x0F) ) { printf("[ISO15693 Tags]\n"); } else if(0x06 == (Buff[5] & 0x0F) ) { printf("[Philips I-Code EPC]\n"); } else if(0x07 == (Buff[5] & 0x0F) ) { printf("[Philips I-Code UID]\n"); } else { printf("Unknown\n"); } printf("UID : "); for(iCnt = 7; iCnt < 15; ++iCnt) { printf("%02X ", Buff[iCnt]); } putchar('\n');
*/ //------------------------------------------ //printf("%04X\n", CRC16(Buff, Buff[0]-5) ); //printf("%04X\n", CRC16(Buff, Buff[0]-2) ); /*// Get Software Version ucTemp = Buff[4]; Buff[4] = Buff[5]; Buff[5] = ucTemp; // Big endian이라서 스왑해줌 printf("SW-REV : %d\n", *((unsigned short *)(&Buff[4])) ); printf("D-REV : %d\n", Buff[6] ); printf("HW-TYPE : %d\n", Buff[7] ); printf("SW-TYPE : "); switch( *((unsigned short *)(&Buff[8])) ) { case 30: printf("ID ISC.M01\n"); break;
case 31: printf("ID ISC.M02\n"); break;
case 71: printf("ID ISC.PRH100.U (USB-Version)\n"); break;
case 72: printf("ID ISC.PRH100\n"); break;
case 73: printf("ID ISC.MR100.U (USB-Version)\n"); break;
case 74: printf("ID ISC.MR100 / .PR100\n"); break;
case 75: printf("ID ISC.MR200-A / -E\n"); break;
case 40: printf("ID ISC.LR100\n"); break;
case 41: printf("ID ISC.LR200\n"); break;
case 91: printf("ID ISC.LRU1000\n"); break;
case 80: printf("ID CPR.M0\n"); break;
case 81: printf("ID CPR.02\n"); break;
case 84: printf("ID CPR.M03 (586/#)\n"); break;
default: printf("unknown\n"); } ucTemp = Buff[9]; Buff[9] = Buff[10]; Buff[10] = ucTemp; // Big endian이라서 스왑해줌 printf("TR-TYPE : ");
if( 0 != ((*((unsigned short *)(&Buff[9]))) & 0x0001) ) { printf("[I-Code 1] "); } if( 0 != ((*((unsigned short *)(&Buff[9]))) & 0x0002) ) { printf("[Tag-it HF] "); } if( 0 != ((*((unsigned short *)(&Buff[9]))) & 0x0008) ) { printf("[ISO 15693] "); } if( 0 != ((*((unsigned short *)(&Buff[9]))) & 0x0040) ) { printf("[I-Code EPC] "); } if( 0 != ((*((unsigned short *)(&Buff[9]))) & 0x0080) ) { printf("[I-Code UID] "); } putchar('\n'); */ tcsetattr(iDev, TCSANOW, &stOldState); // 시리얼 포트의 원래 속성 복귀 close(iDev); // 시리얼 포트 닫음
return 0; }
void Handle_Serial_Sig(int Arg) { printf("Receive SIGIO Signal\n"); iBreak = 1; }
#define CRC_POLYNOM 0x8408 #define CRC_PRESET 0xFFFF unsigned short CRC16(unsigned char *DATA, unsigned int cnt) { unsigned short crc = CRC_PRESET; unsigned int i; unsigned int j; /* cnt = number of protocol bytes without CRC */ for (i = 0; i < cnt; i++) { crc ^= DATA[i]; for (j = 0; j < 8; j++) { if (crc & 0x0001) crc = (crc >> 1) ^ CRC_POLYNOM; else crc = (crc >> 1); } } return crc; }
|