비동기 OVERLAPPED 읽기 수행하기
일단 비동기 read부터 알아보자. 역시나 백문이 불여일견이니 코드부터 보자
DWORD CSerialz::ReadData(BYTE *pBuff, DWORD nToRead) //COMSTAT은 현재 읽기, 쓰기 버퍼등 통신에 관련된 상태를 담는 구조체
//장치를 사용 할 수 있도록 오류플래그를 받아오고 오류 상태를 해제한다. //그리고 장치 상태를 얻어온다.
//읽기 버퍼에 아직 읽지 못하고 남아있는 바이트가 남아 있는 경우 //dwRead에 다시 저장 비동기 함수라 바로 FALSE 반환 //COMMTIMEOUTS에 읽기는 기다리지 않도록 설정한 상태 &m_OverlappedRead, &dwRead, TRUE)) //장치의 에러 상태를 해제한다. } //작업큐에 읽기 작업이 정상적으로 저장되지 못한 경우 //에러상태를 해제한다.
//실제로 읽은 바이트 수 반환 |
뭐 딱히 별다른 설명이 필요하지 않다. 읽는 것 자체는 Overlapped write와 크게 다르지 않다. 다르다고 할 만한게 있다면 ClearCommError의 사용 정도가 있겠다. ClearCommError 함수는 파일디스크립터 (핸들) 이 가리키는 IO Device를 사용 할 수 있도록 에러 상황을 받아오고서는 에러 상태를 해제한다. 그리고 IO Device관련된 정보를 받아오는 기능을 한다.
이제 우리는 읽기 버퍼로부터 바이트를 읽어 올 수 있게 되었다. 그렇다면 이제 남아있는 문제는 "어떻게 읽기 버퍼로 읽을 수 있는 바이트가 저장되는 것을 알아 차릴 수 있는 가?"이다. 방법은 쓰레드를 이용해 읽기 버퍼에 데이터가 들어올 때 발생하는 이벤트를 감시하고 있는 것인데 쓰레드로 돌릴 함수는 아래와 같다.
//COM 포트에서 이벤트가 일어나는지 감시하는 스레드 함수 DWORD CSerialz::THWatchEvPort(CSerialz *pComm)
// Overap Structure 설정
// m_hIDComDev COM 포트의 읽기 버퍼에 데이터가 들어왔을 때 발생하는 //이벤트및 몇가지 에러 상황을 감지하도록 설정 EV_RXCHAR | EV_BREAK | EV_ERR )) bOk = FALSE;
// OVERLAPPED 구조체 설정및 COM포트의 감지 이벤트 설정 중에 문제가 //발생했으면 return FALSE AfxMessageBox(_T("Error while Receive Waiting") + pComm->szPort); return FALSE; }
// port가 열려 있는 동안.....포트가 PortClose에 의해 닫히면 m_bPortOnOff // 가 FALSE가 되어 종료. //펜딩되면 FALSE 반환. OVERLAPPED의 이벤트는 함수 호출시 자동 RESET //이벤트가 발생하면 다음단계로 진행 //에러로 인한 이벤트 발생시 스레드 종료
//발생 이벤트가 읽기 버퍼에 데이터 수신으로 인한 이벤트인 경우 { //읽기 버퍼에서 4096 (전체 버퍼 싸이즈) 만큼 읽어 들여와서 읽기 //성공한 바이트 수를 dwBufferConter에 저장한다. //OVERLAPPED 구조체의 이벤트 핸들을 닫고 스레드 포인터를 NULL로 한다. return(TRUE); |
주석만으로 전체 코드 구성을 이해 하는데 충분하다고 생각한다. 위의 함수를 CreateThread함수나 AfxBeginThread를 이용하여 돌리면, 읽기 버퍼에 데이터가 들어오는 경우 읽기 버퍼에서 더이상 읽을 버퍼가 없을 때까지 읽어들여 온다.
이상 RS232를 이용한 시리얼 통신 코드는 링크를 통해 볼 수 있다.(비공개)
'프로그래밍 > RS232 시리얼 통신' 카테고리의 다른 글
시리얼 통신_OVERLAPPED 구조체를 이용해 비동기 쓰기를 해보자 (5) | 2014.08.26 |
---|---|
시리얼 통신_시리얼 통신 포트의 특성을 DCB 구조체로 설정해 보자 (0) | 2014.08.26 |
시리얼 통신_OVERLAPPED 구조체를 설정하자 (0) | 2014.08.26 |
시리얼 통신_COM 포트에 읽기 쓰기 타임아웃을 설정하자 (0) | 2014.08.26 |
시리얼 통신_시리얼 포트를 열어보자 (0) | 2014.08.26 |