//gps 에서 오는 데이터를 읽으면, x,y 좌표를 읽을 수 있다. //그 좌표를 구글 맵이나 네이버 맵에 던져주면 지도에 현재 위치가 표시 되는 것이다. //나머지는 맵하고 연동만 하면 되는 것이다. gps의 문제점은 지도가 있냐 없느냐, 어디에 그 좌표를 찍을것이냐 라는 문제다. //시리얼만 할 줄 알면 그 장비에 대한 //그 프로토콜만 알면 시리얼 통신이야 쉽다라는 것이다.
#include <windows.h> #include <stdio.h>
#define CRC_POLYNOM 0x8408 #define CRC_PRESET 0xFFFF
unsigned short CRC16(void *vpData, unsigned int uiLen);
int main() { u_char caString[255] = {
0x0D //총 갯수 3개 , 0x00 , 0x71 , 0x00, 0x30 , 0x00, 0x07 //비프음만 Flash 동작 , 0x00, 0x0A /* , 0x00, 0x3F , 0x00, 0x07 //OSF => 두 LED, 비프음 Flash 동작. , 0x00, 0x0F //LED는 red : 01, grn : 11 다른 속도로 동작 */ /* , 0x00, 0x0F , 0x00, 0x0F //OSF => 두 LED, 비프음 Flash 동작. , 0x00, 0x0A //LED는 red : 01, grn : 11 같은 속도로 동작 */ , 0x00, 0x00 }; DWORD dwCount; //double world Written 쓰기 후 실제 쓴 바이트 수 저장 공간 DCB sPState; //struct port state 시리얼 포트 상태 저장 HANDLE hComm = CreateFile(L"COM6" //handle of Communication , GENERIC_READ | GENERIC_WRITE , 0 , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , 0);
if (INVALID_HANDLE_VALUE == hComm) { printf("포트 열 수 없음.\n"); return 0; }
if (0 == SetupComm(hComm, 4096, 4096)) { printf("버퍼 설정 에러.\n"); CloseHandle(hComm); return 0; }
if (0 == PurgeComm(hComm, PURGE_TXABORT | PURGE_TXCLEAR)) { printf("버퍼 초기화 에러.\n"); CloseHandle(hComm); return 0; }
sPState.DCBlength = sizeof(sPState);
if (0 == GetCommState(hComm, &sPState)) { printf("시리얼 상태 읽기 에러.\n"); CloseHandle(hComm); return 0; } sPState.BaudRate = CBR_38400; //속도 sPState.ByteSize = 8; //바이트 크기 sPState.Parity = EVENPARITY; //짝수 패리티 sPState.StopBits = ONESTOPBIT; //스톱 비트
if (0 == SetCommState(hComm, &sPState)) { printf("시리얼 상태 설정 에러.\n"); CloseHandle(hComm); return 0; }
*((unsigned short*)(caString + caString[0] - 2)) = CRC16(caString, caString[0] - 2); //46, 41 뺐음, (2바이트 캐스팅)(주소) => 46 41 이 계산되어 넣었다라는 뜻., 이제 crc 값은 자동 생성 된다.
WriteFile(hComm, caString, caString[0], &dwCount, 0); ReadFile(hComm, caString, 1, &dwCount, 0); ReadFile(hComm, (caString + 1), (caString[0] - 1), &dwCount, 0); //하나 수신 했기에 -1 printf("수신한 바이트 수는 2 : %d\n", dwCount + 1);
CloseHandle(hComm);
return 0; }
//uiLen == number of protocol bytes without CRC unsigned short CRC16(void *vpData, unsigned int uiLen) { unsigned short crc = CRC_PRESET; unsigned int i, j; unsigned char *DATA = (unsigned char*)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; }
|