我打开的串口句柄为何传到线程里进行读取的时候返回无效句柄啊?
程序是这样的:
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是否为有效句柄
[解决办法]
可以考虑在线程里打开串行口