#include <stdio.h> #include <windows.h>
unsigned short Emb_Crc(void *);
int main() { HANDLE hComm; int iCnt; char caString[] = "HI"; unsigned char msg[] = {0x0D,0x00,0x71,0x00,0x1F,0x00,0x00, 0x00,0x01,0x00,0x00,0xFF,0xFF}; DWORD dwWrite; DWORD dwRead; DCB sPS; //시리얼 포트 삭제 및 저장 :: PORT STATUS이다. COMMTIMEOUTS cTime;
unsigned char uc; hComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); //COM3 쓰면 포트가 열린다. OPEN 존재하는가, FILE 일반적으로 연다) //COM포트에 관한 정보가 리턴되서 hComm에 저장된다. if(INVALID_HANDLE_VALUE == hComm) //잘못 된 입력값 { printf("PORT OPEN ERROR!!\n"); return 0; } if(0 == SetupComm(hComm, 4096, 4096)) //버퍼 설정 { printf("BUFFER CONTROL ERROR!!\n"); CloseHandle(hComm); return 0; }
if(0 == PurgeComm(hComm, PURGE_TXABORT | PURGE_TXCLEAR)) //포트 초기화 { printf("PORT INIT FAIL!!\n"); CloseHandle(hComm); return 0; }
sPS.DCBlength = sizeof(sPS); //sPS안에 구조체 값 세팅 if(0 == GetCommState(hComm, &sPS)) //COM1의 정보 변경 { printf("PORT STATUS READING FAIL!!\n"); CloseHandle(hComm); return 0; } /* 통신 설정 해준다. 38400, 8bit, 짝수패리티, 정지비트 1, 흐름제어 없음 */ sPS.BaudRate = CBR_38400; sPS.ByteSize = 8; sPS.Parity = EVENPARITY; sPS.StopBits = ONESTOPBIT;
/* 변경한 값으로 세팅한다. (검사까지) */ if(0 == SetCommState(hComm, &sPS)) { printf("PORT STATUS WRITING FAIL!!\n"); CloseHandle(hComm); return 0; } /* CRC값 */ *((unsigned short *)(msg + 11)) = Emb_Crc(msg);
/* 파일에 기록한다. (핸들, 주소, 사이즈) */ WriteFile(hComm, msg, sizeof(msg), &dwWrite, 0); printf("%d\n", dwWrite);
/* 파일핸들, 데스테네이션, 사이즈 */ ReadFile(hComm, msg, 1, &dwRead, 0); if(sizeof(msg) < msg[0]) { msg[0] = sizeof(msg) - 1; } ReadFile(hComm, msg+1, msg[0]-1, &dwRead, 0);
/* msg의 가장 앞에 전체 길이가 들어가 있다 */ for(iCnt=0;iCnt<msg[0];++iCnt) { printf("%02X ", msg[iCnt]); } putchar('\n');
CloseHandle(hComm);
return 0; }
unsigned short Emb_Crc(void *arg) { unsigned short i; unsigned short j; unsigned short cnt; unsigned short crc=0xFFFF; unsigned short temp; unsigned char *buf = arg;
cnt = (*buf) - 2; //CRC 계산하기 위해서 -2를 해준다.
for(i=0 ; i < cnt ; ++i) { crc^= *(buf + i); for(j=0 ; j < 8 ; ++j) { if(0 != (crc&0x0001)) { crc=(crc>>1)^0x8408; } else { crc=(crc>>1); } } }
return crc; }
|