C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[54195] 최보현.U&I님이 컴포넌트자료실에 올린 시리얼통신 질문좀 올립니다.
오전&오후 [kkhhyy11] 2185 읽음    2008-08-01 18:08
제가 요즘 핸드폰 시리얼통신 프로그램을 만들일이 있어서
올려주신 컴포넌트를 사용중에
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;

+ -

관련 글 리스트
54195 최보현.U&I님이 컴포넌트자료실에 올린 시리얼통신 질문좀 올립니다. 오전&오후 2185 2008/08/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.