首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

小弟我打开的串口句柄为何传到线程里进行读取的时候返回无效句柄啊

2012-01-31 
我打开的串口句柄为何传到线程里进行读取的时候返回无效句柄啊?程序是这样的:intMdm::process(void){CCmth

我打开的串口句柄为何传到线程里进行读取的时候返回无效句柄啊?
程序是这样的:
int   Mdm::process(void)
{
    CCmth   *pCCmth;
    HANDLE   m_ModemHandle=NULL;

    m_ModemHandle   =   openComPort(4);//打开COM4口
    if(m_ModemHandle   !=   NULL)
          pCCmth=   new   CCmth(m_ModemHandle);
    .....
    .....

  delete   pCCmth;
  return   0;
}
/////////////////////////////////////////////
HANDLE   m_Handle;
CCmth::CCmth   (HANDLE   pMdmHandle)
{
ASSERT(pMdmHandle!=NULL);

m_Handle   =   pMdmHandle;

m_Thread   =   NULL   ;
m_Thread   =   AfxBeginThread(Terminal_Thread,   this);
TRACE( "Thread   started\n ");

return   ;
}

UINT   CCmth::Terminal_Thread(LPVOID   pParam)
{
CCmth   *pCmth   =   (CCmth   *)pParam;
BYTE   RecvBuf[1024];
int   FramType;

for(;;)
{
memset(   RecvBuf   ,   0   ,sizeof(RecvBuf));
if(pCmth-> WaitForFrame(RecvBuf,sizeof(RecvBuf),100)){
                                      ......

}
}

          return   0;
}

int   CCmth::WaitForFrame(BYTE   *buf,   int   MaxLen,   int   TimeoutMs)
{
int   ret   ;
BYTE   *sbuf;

sbuf   =   new   BYTE   [MaxLen+100];

k   =   0   ;
do  
{
            ret   =   ReadData(sbuf+k,1,2);
                              k   +=   ret   ;
                              ......
                  }while(!CheckTimeOut(TimeoutMs));

                delete   sbuf;
                return   ret   ;
}


int   CCmth::ReadData(BYTE   *pData,   int   MaxLen,   int   TimeOutMSec)
{
ASSERT(m_Handle!=NULL);
BOOL   bResult   =   TRUE;

DWORD   BytesRead   =   0;

DWORD   dwErrorFlags;
COMSTAT   ComStat;
int   i   ;
for(i   =   0   ;   !CheckTimeout(TimeOutMSec)   ;   i++){
ClearCommError(   m_Handle,   &dwErrorFlags,&ComStat   );
if(   ComStat.cbInQue   )   break;
}
if(   !ComStat.cbInQue   )   return   0;


bResult   =   ReadFile(m_Handle,pData,MaxLen,&BytesRead,&(m_OverlappedRead));
if(!bResult)
{
dwErrorFlags   =   GetLastError();//此时得到的error是ERROR_INVALID_HANDLE
if(dwErrorFlags==ERROR_IO_PENDING)
{
WaitForSingleObject(m_OverlappedRead.hEvent,2000);
bResult   =   GetOverlappedResult(m_Handle,&m_OverlappedRead,&BytesRead,TRUE);
return   ((int)BytesRead);
}
return(0);
}
return   ((int)BytesRead);    

}


[解决办法]
我猜想无效句柄指的可能不一定是m_Handle
你检查一下OVERLAPPED m_OverlappedRead中的hEvent是否为有效句柄
[解决办法]
可以考虑在线程里打开串行口

热点排行