Visual C++ 6.0에서 COM포트 오픈하기
1. 아래 소스대로 Ctrl+C/Ctrl+V 하면 COM포트는 활짝 열린다.
DCB dcb = {sizeof(DCB)};
CString ComPortName;
ComPortName.Format(_T("COM%d"),ComPortNum+3);
HANDLE m_hComm;
m_hComm = CreateFile(ComPortName,
GENERIC_READ | GENERIC_WRITE, // 접근모드 읽기쓰기인가 읽기 전용인가
0 , // 다른 프로그램과 공유를 할것인가 아닌가.
NULL, // 보안에 관한 속성
OPEN_EXISTING, // 어떻게 열것인가
0, // 파일 속성(보통 파일이면서 overlapped 되게 한다.)
NULL); // 템플릿 파일 핸들러
if (m_hComm == (HANDLE) -1)
{
AfxMessageBox("Com Port Connect Fail!");
return;
}
// EV_RXCHAR event 설정
SetCommMask(m_hComm, EV_BREAK | EV_ERR | EV_RXCHAR | EV_TXEMPTY);
// InQueue, OutQueue 크기 설정.
SetupComm(m_hComm, 4096, 4096);
// 포트 비우기.
PurgeComm(m_hComm, PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);
// dcb 설정
dcb.DCBlength = sizeof(DCB);
GetCommState(m_hComm, &dcb); // 예전 값을 읽음.
dcb.BaudRate = CBR_115200; //BaudRate 비트/초
dcb.ByteSize = 8; //데이터비트
dcb.Parity = NOPARITY; // 패리티
dcb.StopBits = ONESTOPBIT; // 정지비트
dcb.fParity = FALSE;
dcb.fNull = FALSE;
if (! SetCommState(m_hComm, &dcb))
{
AfxMessageBox("Com Port Connect Setting Fail!");
//ClosePort();
return;
}
COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = 0;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 0;
timeouts.WriteTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 0;
if (!SetCommTimeouts(m_hComm, &timeouts))
return;
2. 하나씩 뜯어보자. 물론 내가 아는거만 적는다.
1) CreateFile() - COM포트 열기
- 1번째 인자 : 연결할 COM포트 정하기.
여기서는 ComPortName 문자열에 들어간 값의 포트가 열린다. ex) COM3, COM4, COM5.....
- 2번째 인자 : 포트의 엑서스 권한을 정하기.
GENERIC_READ | GENERIC_WRITE => 읽기, 쓰기 권한을 가진다. 나머지 옵션은 검색~
- 3번째 인자 : 공유모드 정하기. 다른 프로세스에서 접근할 수 있게 할지 정하기.
FILE_SHARE_READ | FILE_SHARE_WRITE => 다른프로세스의 읽기, 쓰기 권한을 가진다.
- 4번째 인자 : 보안에 관한 속성. 잘 모른다. 그냥 NULL로 정하자.
- 5번째 인자 : COM포트를 어떻게 열것인가? 하나만 지정할 수 있다.
OPEN_ALWAYS => 항상 새로 연다. 역시나 나머지는 옵션은 검색~
- 6번째 인자 : COM포트의 속성을 지정한다고 하지만, 무슨말인지 모른다.
FILE_FLAG_OVERLAPPED로 정하고 쓰자. 검색해도 뭔말인지 모른다.
- 7번째 인자 : 그냥 NULL로 쓰자.
2) 포트설정
- dcb.BaudRate : 전송속도 정하는 것이다. 9.6K, 14.4K같은거... 9600, 14400 이렇게 넣으면 된다.
이거만 정하고 나머진 기본으로 가면 그냥 뚫린다. 귀찮게 다른 값들은 건들면 노노~
- dcb.ByteSize : 데이터비트다. 기본 8
- dcb.Parity : 패리티다. 기본 0
- dcb.StopBits : 정지비트다. 기본 1
3. 사용완료했으면 닫아줘야지.
- COM포트를 열어서 다 사용했다면 그만쓰겠다고 신고해야하는거 아니겠어.
SetCommMask(m_hComm, 0);
PurgeComm(m_hComm, PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);
CloseHandle(m_hComm);
열때 사용했던 핸들만 조용히 CloseHandle해주면 된다.
4. COM포트로 데이터 날려보내기.
- WriteFile을 사용해서 Open한 포트로 데이터를 날려보내면 된다. Writedata[]의 값이 날아간다.
dwWritten의 값이 0으로 return되면 안 날아간거니 소스 다시 뜯어보도록~
5. 데이터 받기.
- ReadFile을 사용해서 들어오는 데이터를 읽으면 된다. 읽은 데이터는 pBuff에 저장된다.
'Programming > Visual C++ 6.0' 카테고리의 다른 글
Edit Box 사용하기 : EditBox 생성, 입력값 가져오기 (2) | 2015.02.09 |
---|---|
Timer 사용하기 : WM_TIMER, SetTimer, KillTimer (2) | 2015.02.06 |
현재시간 가져오기 : GetCurrentTime (0) | 2015.02.04 |
ListBox (리스트박스) 사용하기 (0) | 2015.02.03 |