이전에 올린 포스트에서 어떻게 시리얼 COM 포트를 여는지, 또 어떻게 OVERLAPPED 구조체를 만드는지와 포트를 이용한 읽기 쓰기 작업에 타임아웃을 거는 방법에 대해 알아보았다. 그런데 뭔가 허전하지 않은가? 맞다. 시리얼 COM 포트를 열긴 열었는데 실제로 이 시리얼 통신이 어떤 특성을 가질 것인지는 설정하지 않았다.

 

그래서 요번에는 DCB (Device Control Block)를 이용한 COM 포트의 시리얼 통신 특성을 설정해 볼 것이다.

 

먼저 시리얼 통신 특성 설정에는 DCB 구조체가 사용된다. 시리얼 통신에 사용되는 여러가지 통신특성들이 설정되어 있는 구조체로 자세한 사항은 아래를 참조하면 되겠다.

 

 

매우 많은 필드와 설명이 있지만, 알아야 되는 필드는 몇개 되지 않는다. 대부분의 설정값은 시스템이 초기에 설정해 놓은 값을 그대로 사용한다. 사용자는 GetCommState함수를 이용해 시스템이 설정해 놓은 COM 포트의 설정값을 가지고 오고 몇몇 변수를 고친다음에 SetCommState로 다시 COM 포트의 설정값을 변경하면 된다.

 

 BOOL GetCommState (HANDLE hFile, LPDCB lpDCB)

 BOOL SetCommState (HANDLE hFile, LPDCB lpDCB)

 

실제 사용은 아래와 같이 한다.

 

 

 

 

 

Get으로 가지고 와서 버드레이트, 패리티, 바이트로 뭉쳐서 쓰기 위해 받는 비트 수, 그리고 스톱 비트를 몇개 사용할 것인지를 결정하여 Set으로 설정했다.

(코드를 그대로 복사하다보니..-_- 위에 접어놓은 DCB 설명을 참조하여 설정할 것)

 

이제 거의 모든 설정이 다 끝났다. 마지막으로 아래 SetupComm 함수를 이용하여 읽기 쓰기에 사용할 큐의 크기를 지정하고 각 큐를 깔끔하게 비워낸다.

 

//읽기 쓰기 큐 4096바이트설정 

SetupComm(m_hIDComDev, 4096, 4096)

//COM 포트를 , 2번째 인자 왼쪽부터 현재 전송작업 취소, 쓰기버퍼 비움, 현재

//읽기 작업 취소, 읽기 버퍼 비움 한다. 라는 의미 

PurgeComm(m_hIDComDev, PURGE_TXABORT | PURGE_TXCLEAR | 

                    PURGE_RXABORT | PURGE_RXCLEAR);

 

비로소 COM 포트를 이용한 시리얼 통신을 할 수 있는 상태가 되었다.

Posted by 굿쟌
,