|
제가 요즘 핸드폰 시리얼통신 프로그램을 만들일이 있어서
올려주신 컴포넌트를 사용중에
CommThreadWriteData()에서 정상적으로 데이타를 보내는데
리턴값은 항상 false로 나오더라구요
그래서
Serial1->CommThreadWriteData();
DWORD error = GetLastError();
해서 봤는데 error값이 ERROR_IO_PENDING값으로 나오더군요
그래서 소스를 살펴봤는데
여기서 GetLastError()에서 ERROR_IO_PENDING값일때 왜 false를 리턴해주신거가요?
IOCP에서 ERROR_IO_PENDING값은 정상적인값으로 알고 있는데
아 그리고 에러체크하실때 37번인가 핸들이 정상적으로 열리지 않았다는 에러가 있는데
예로 잘못해서 핸드폰 시리얼케이블이 빠졌을때 그거 체크안하면
밑에 WaitForSingleObject(EvnWrite.hEvent, INFINITE); 여기서 프로그램 죽습니다. ^^;
무한대기상태로 빠지는거죠
그래서 WaitForSingleObject(EvnWrite.hEvent, INFINITE); INFINITE대신에 TIMEOUT을 주던가
밑에처럼 수정이 되어야 할거 같은데 제가 틀렸으면 좀 알려주세요
DWORD ErrorCode;
ErrorCode = GetLastError();
if(ErrorCode != ERRO_IO_PENDING) //ERROR_IO_PENDING값이 아닐때는 Error로 처리
Result = false;
else{
}
컴포넌트 소스중에 일부
bool __fastcall TSerial::CommThreadWriteData(BYTE *Buffer, WORD Size)
{
BOOL Result;
DWORD Written;
DWORD EventFlag;
COMSTAT ComStatus;
EvnWrite.Offset = 0;
EvnWrite.OffsetHigh = 0;
EnterCriticalSection(&DevSync);
if (!WriteFile(DevHandle, Buffer, Size, &Written, &EvnWrite))
{
if(GetLastError() == ERROR_IO_PENDING) Result = FALSE;
else{
EventFlag = WaitForSingleObject(EvnWrite.hEvent, INFINITE);
switch(EventFlag)
{
case WAIT_OBJECT_0:
if(!GetOverlappedResult(DevHandle, &EvnWrite, &Written, FALSE))
Result = FALSE;
else
Result = TRUE;
break;
default:
Result = FALSE;
break;
}
}else{
Result = TRUE;
}
LeaveCriticalSection(&DevSync);
return Result;
|