Figure 3: Function CPort::Read

int CPort::Read(char* p,int nMax){
    DWORD    dwErr, dwLen;
    COMSTAT  comstat;    

    if (!IsConn()) return 0;
    if (!ClearCommError(_pData->_hPort,&dwErr,&comstat)) {
        Err("ClearCommError");
        return 0;
    };
    
    if (dwLen = min((DWORD)nMax,comstat.cbInQue)){
        if (!ReadFile(_pData->_hPort, p, dwLen, &dwLen,
                      &_pData->_olRead))
            if (ERROR_IO_PENDING == GetLastError()) {
                if (WaitForSingleObject(_pData->_olRead.hEvent,
                                        1000)){
                    dwLen =  0;
                }
                else{
                    GetOverlappedResult(_pData->_hPort,
                                        &_pData->_olRead,
                                        &dwLen,FALSE);
                    _pData->_olRead.Offset += dwLen  ;
                };
            }
            else 
                dwLen = 0 ;
    };
    if (!dwLen) DoneReading();
    return dwLen;
};