读书人

小弟我打开的串口句柄为何传到线程里进

发布时间: 2012-01-31 21:28:41 作者: rapoo

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

读书人网 >VC/MFC

热点推荐