타임아웃 설정하기

 

 시리얼 통신 포트에 읽기 또는 쓰기 작업을 수행하려고 하는데 무언가 문제가 생겨서 작업이 진행되지 않는다면 어떻게 해야 할까? 마냥 하염없이 기다리다보면 프로그램은 영영 돌아오지 못하게 된다. 그래서 시리얼 통신에서는 COMMTIMEOUTS구조체를 제공하여 언제까지 작업을 시도해 볼 것인지를 정 할 수 있게 해놓았다.

 

일단 COMMTIMEOUTS 구조체는 아래와 같다.

 

 typedef struct _COMMTIMEOUTS{
  DWORD ReadIntervalTimeout;
  DWORD ReadTotalTimeoutMultiplier;
  DWORD ReadTotalTimeoutConstant;
  DWORD WriteTotalTimeoutMultiplier;
  DWORD WriteTotalTimeoutConstant;
}COMMTIMEOUTS、*LPCOMMTIMEOUTS;

 

인수를 맨 위에꺼 부터 설명하자면,

 

ReadIntervalTimeout은 한바이트를 읽고 다음 바이트를 읽는데 기다릴 시간으로 ms단위

 

ReadTotalTimeoutMultiplier & ReadTotalTimeoutConstant 는 묶어서 설명 하자면

기다릴 시간=읽기요청 바이트 수*ReadTotalTimeoutMultiplier+ ReadTotalTimeoutConstanct

위와 같은 계산식을 따라 기다릴 시간을 설정한다.

 

WrtieTotalTimeoutMultiplier & TotalTimeoutConstant도 묶어서 설명하자면,

기다릴 시간=쓰기요청 바이트 수*WriteTotalTimeoutMultiplier+ WriteTotalTimeoutConstanct

위와 같은 계산식을 따라 기다릴 시간을 설정한다.

 

참고로 여기서 아주 중요한 것이 하나 있는데 ReadIntervalTimeout이 0xFFFFFFFF 즉, MAX_DWORD이고 ReadTotalTimeoutMultiplier와 Constant가 0인 경우에는 재밋게도 현재 읽으력고 하는 버퍼에서 그냥 있는 만큼 읽고 바로 그냥 작업을 종료해 버리게 된다.

 

예를 들어 아래와 같이 타임아웃 구조체를 설정했다고 하면

 

 

 

Read에는 없으면 없는데로 있으면 있는데로 읽기 버퍼에 작업을 수행하는 그때에 읽고 작업을 마친게 된다. 그리고 쓰기 작업에는 얼마나 많이 쓰든지 상관 없이 5000ms 즉, 5초까지는 계속 쓰기 작업을 시도한다.

 

그럼 이제 남은 것은 이 타임아웃 구조체를 시리얼 통신 포트에 적용 하거나, 이미 적용되어 있는 정보를 가져 오는 것인데 이 작업에는 아래의 두가지 함수가 사용된다.

 

 BOOL SetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeOuts )

 BOOL GetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts )

 

인자는 뭐 딱 봐도 통신에 사용할 시리얼 포트의 파일디스크립터 (핸들)과 앞서 설명한 COMMTIMEOUTS객체의 포인터 이다. 실패시 0을 반환한다.

 


    지정된 통신 장치에서 모든 읽기, 쓰기 작업에 대해 타임아웃 매개변수를 설정

 

Posted by 굿쟌
,