본문 바로가기
코스웨어/15년 스마트컨트롤러

2015-12-10 RFID 개인업무일지 - 천정호

by 알 수 없는 사용자 2015. 12. 10.
728x90
반응형







#include <stdio.h>

#include <Windows.h>


#pragma comment(lib, "Ws2_32.lib")


#define CRC_PRESET  0xFFFF

#define CRC_POLYNOM 0x8408


unsigned short RFID_CRC(void *, unsigned int);


int main() {

u_char caString[255] = { 0x0D, 0x00, 0x71, 0x00,

0x30, 0x00, 0x00, 0x00,

0x0A, 0x00, 0x00 };


DCB sPState;

DWORD dwCount;

HANDLE hComm

= CreateFile("COM4",

GENERIC_READ | GENERIC_WRITE,

0,

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,

0);


if (hComm == INVALID_HANDLE_VALUE) {

printf("Port Open Error\n");

return 0;

}


if (SetupComm(hComm, 4096, 4096) == 0) {

printf("Buffer Setting Error\n");

CloseHandle(hComm);

return 0;

}


if (PurgeComm(hComm, PURGE_TXABORT | PURGE_TXCLEAR) == 0) {

printf("Buffer Error");

CloseHandle(hComm);

return 0;

}


sPState.DCBlength = sizeof(sPState);


// sPState에 기존의 내용을 읽어온다.

if (GetCommState(hComm, &sPState) == 0) {

printf("Serial Read Error\n");

CloseHandle(hComm);

return 0;

}


// 필요한 부분만 수정

sPState.BaudRate = CBR_38400;

sPState.ByteSize = 8;

sPState.Parity = EVENPARITY;

sPState.StopBits = ONESTOPBIT;


// 필요한 부분을 수정하였으면 설정을 한다.

if (SetCommState(hComm, &sPState) == 0) {

printf("Serial State Setting Error\n");

CloseHandle(hComm);

return 0;

}


// 46 41을 넣는 방식

*((unsigned short *)(caString + caString[0] - 2)) = RFID_CRC(caString, caString[0] - 2);


WriteFile(hComm, caString, caString[0], &dwCount, 0);


// 세 번째 인자는 읽을 크기를 적는다.

ReadFile(hComm, caString, 1, &dwCount, 0);


ReadFile(hComm, caString + 1, caString[0] - 1, &dwCount, 0);


/*

if (WriteFile(hComm, caString, caString[0], &dwWritten, 0) == 0) {

printf("Write Error\n");

}

else {

printf("Write Success\n");

}

*/


CloseHandle(hComm);


return 0;

}


unsigned short RFID_CRC(void *vpData, unsigned int uiLen) {

int i, j;

unsigned char *DATA = vpData;

unsigned short CRC = CRC_PRESET;


for (i = 0; i < uiLen; i++) {

CRC ^= DATA[i];


for (j = 0; j < 8; j++) {

if (CRC & 0x0001)

CRC = (CRC >> 1) ^ CRC_POLYNOM;

else

CRC = (CRC >> 1);

}

}

return CRC;

}



728x90