RFID
- 가상머신에서 하면 안됨
-
- VMWare에 새로운 리눅스를 설치해야
- 도스에서 시리얼 통신으로 RFID 제어 프로그램 작성
-
- 포트 번호가 2 자리수 이상이면 포트가 안 열린다
-
- 장치 속성에서 수정
#include <windows.h>
#include <stdio.h>
int main(void)
{
u_char caString[255] = {0x0D, 0, 0x71, 0, 0x30, 0, 0, 0, 0x0A, 0, 0, 0x46, 0x41};
DWORD dwCnt;
DCB sPState;
unsigned short ucTmp;
// 1. 시리얼 포트 열기
HANDLE hComm = CreateFile("COM6" // 포트 이름
, GENERIC_READ|GENERIC_WRITE // RW가능
, 0
, NULL
, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, 0);
if(INVALID_HANDLE_VALUE == hComm)
{
printf("포트 열 수 없음\n");
return 0;
}
if( 0 == SetupComm(hComm, 4096, 4096)) // 2. Read버퍼와 write 버퍼 길이 설정
{
printf("버퍼 설정 에러\n");
CloseHandle(hComm);
return 0;
}
if(0 == PurgeComm(hComm, PURGE_TXABORT|PURGE_TXCLEAR)) // 3. 버퍼 초기화
{
printf("버퍼 초기화 에러\n");
CloseHandle(hComm);
return 0;
}
sPState.DCBlength = sizeof(sPState);
if( 0 == GetCommState(hComm, &sPState)) // 4. 현재 시리얼 세팅을 읽어온다
{
printf("시리얼 상태 읽기 에러\n");
CloseHandle(hComm);
return 0;
}
// 5. 시리얼 설정
sPState.BaudRate = CBR_38400;
sPState.ByteSize = 8;
sPState.Parity = EVENPARITY;
sPState.StopBits = ONESTOPBIT;
if(0 == SetCommState(hComm, &sPState)) // 6. 시리얼 세팅 적용
{
printf("시리얼 상태 설정 에러\n");
CloseHandle(hComm);
return 0;
}
WriteFile(hComm, caString, caString[0], &dwCnt, 0); // 7. 시리얼 통신
ReadFile(hComm, caString, 1, &dwCnt, 0);
ReadFile(hComm, caString+1, caString[0]-1, &dwCnt, 0);
printf("수신한 바이트 수는 %d 입니다\n", dwCnt+1);
CloseHandle(hComm);
return 0;
}
- 시리얼로 전송하는 명령을 바꿔서 다른 방식으로 제어
-
- 명령어 문자열의 CRC를 함수를 사용해서 계산
#include <windows.h>
#include <stdio.h>
#define CRC_POLYNOM 0x8408
#define CRC_PRESET 0xFFFF
unsigned short CRC16(void * vpData, unsigned int uiLen);
int main(void)
{
u_char caString[255] = {0x0D, 0, 0x71, 0, 0x0F, 0, 0, 0, 0x0A, 0, 0};
DWORD dwCnt;
DCB sPState;
unsigned short ucTmp;
// 1. 시리얼 포트 열기
HANDLE hComm = CreateFile("COM6" // 포트 이름
, GENERIC_READ|GENERIC_WRITE // RW가능
, 0
, NULL
, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, 0);
if(INVALID_HANDLE_VALUE == hComm)
{
printf("포트 열 수 없음\n");
return 0;
}
// 2. Read버퍼와 write 버퍼 길이 설정
if( 0 == SetupComm(hComm, 4096, 4096))
{
printf("버퍼 설정 에러\n");
CloseHandle(hComm);
return 0;
}
// 3. 버퍼 초기화
if(0 == PurgeComm(hComm, PURGE_TXABORT|PURGE_TXCLEAR))
{
printf("버퍼 초기화 에러\n");
CloseHandle(hComm);
return 0;
}
sPState.DCBlength = sizeof(sPState);
// 4. 현재 시리얼 세팅을 읽어온다
if( 0 == GetCommState(hComm, &sPState))
{
printf("시리얼 상태 읽기 에러\n");
CloseHandle(hComm);
return 0;
}
// 5. 시리얼 설정
sPState.BaudRate = CBR_38400;
sPState.ByteSize = 8;
sPState.Parity = EVENPARITY;
sPState.StopBits = ONESTOPBIT;
// 6. 시리얼 세팅 적용
if(0 == SetCommState(hComm, &sPState))
{
printf("시리얼 상태 설정 에러\n");
CloseHandle(hComm);
return 0;
}
// 7. CRC값 대입
*((unsigned short *)(caString + caString[0] -2)) = CRC16(caString, caString[0]-2);
// 8. 시리얼 통신
WriteFile(hComm, caString, caString[0], &dwCnt, 0);
ReadFile(hComm, caString, 1, &dwCnt, 0);
ReadFile(hComm, caString+1, caString[0]-1, &dwCnt, 0);
CloseHandle(hComm);
return 0;
}
unsigned short CRC16(void * vpData, unsigned int uiLen)
{
int i, j;
unsigned short crc = CRC_PRESET;
unsigned char * DATA = vpData;
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;
}
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20151209-김재홍-Serial_3일차-RFID_도스 (3) | 2015.12.09 |
---|---|
20151209 업무일지 -여지윤- RFID(Dos) (3) | 2015.12.09 |
20151209 - 홍준모 3일차 오전 : 가상 리눅스 RFID 시리얼 통신(실패), 오후 : 도스 RFID 시리얼 통신(성공) (4) | 2015.12.09 |
20151209 윤재희 Dos Serial 통신 (5) | 2015.12.09 |
20151208 - 홍준모 : 리눅스 윈도우 시리얼 통신 2일 차 (2) | 2015.12.09 |
20151208 - 강동조 개인업무일지 (3) | 2015.12.09 |
20151208 임현수 업무일지 RF통신이론, 코드작성 (3) | 2015.12.09 |
2015-12-09 RFID 개인업무일지 - 천정호 (2) | 2015.12.09 |