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에 저장된다.

 

 

 

 

 

           

          

 

 

Posted by 둔한늑대
,