遇到一难题 ,我第一次读写串口数据时没有问题,当我挂起串口读写线程,再次清空串口缓冲的时候,总是会死掉,怎么回事?请大家帮帮忙
大致代码如下void CReciveWindowDlg::StartComm()//开始通信
{
    PurgeComm(m_hFile, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR );  //清除串口缓冲 *****这句经常会死掉(第一次正常)
     m_pWinThread->ResumeThread(); // 开始串口读写线程
}
void CReciveWindowDlg::StopComm()//停止通信
{
    PurgeComm(m_hFile, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR );  //清除串口缓冲
m_pWinThread->SuspendThread(); // 挂起串口读写线程
}//读串口
USHORT CSerial::Read(BYTE *rBuf, USHORT rDataLen)
{
DWORD ReadNum;
DWORD ErrFlag;
DCB dcb;
COMSTAT comstat;
DWORD l = SetFilePointer(m_hFile,0, NULL, FILE_END);
m_LastError = 0; if ( m_bOpenFlag == FALSE )
return (0); if(ClearCommError(m_hFile, &ErrFlag, &comstat) == FALSE) {
m_LastError = GetLastError();
return 0;
}
if(ErrFlag > 0 && ErrFlag != CE_RXOVER ) {
m_LastError = GetLastError();
return 0;
}    if((DWORD)rDataLen > comstat.cbInQue ){
Sleep(0);
return 0;
}
ReadNum = 0;
if (ReadFile( m_hFile, rBuf, (DWORD)rDataLen, (LPDWORD)&ReadNum, NULL) == FALSE)
  ReadNum = 0;
if ( ReadNum <= 0 ){
if (GetCommState( m_hFile, &dcb) == FALSE){
m_LastError = GetLastError();
return (0);
}
} return ((USHORT)ReadNum);
}
//写串口
USHORT CSerial::Write(BYTE *wBuf, USHORT wDataLen)
{
if (m_bOpenFlag  == FALSE)
return (0); DCB dcb;
DWORD WriteNum;
m_LastError = 0;

if (WriteFile( m_hFile, wBuf, (DWORD)wDataLen,
(LPDWORD)&WriteNum, NULL) == FALSE)
WriteNum = 0;
if ( WriteNum <= 0 ){
if (GetCommState( m_hFile, &dcb) == FALSE)
m_LastError = GetLastError();
return (0);
}
return ((USHORT)WriteNum);
}

解决方案 »

  1.   

    我用的是单线程的,读完数据后清空缓冲之后,停止线程后再调用StartComm()还是会死掉
      

  2.   

    这样试试:
    PurgeComm(m_hFile, PURGE_TXCLEAR ¦PURGE_RXCLEAR ); 
      

  3.   

    换成PurgeComm(m_hFile, PURGE_TXCLEAR ¦PURGE_RXCLEAR ); 
    还是不行
      

  4.   

    把PurgeComm放到ReadFile和WriteFile的后面试试。
      

  5.   

    第一次读取完后,关闭COM口清空再挂起线程接着做.
      

  6.   

    我想问一下,在使用   
     PurgeComm(m_hFile, PURGE_TXABORT ¦PURGE_RXABORT ¦PURGE_TXCLEAR ¦PURGE_RXCLEAR )
    和ClearCommError的时候有没有什么要注意的地方,我现在出毛病的地方都是在这两句上出的。
      

  7.   

    使用PurgeComm和ClearCommError应该不会引起程序挂掉的现象,
    我发现你使用了SetFilePointer,把这句去掉。
      

  8.   

    SetFilePointer好像没有影响,去掉后还是那样。
      

  9.   

    设置个断点 Step into 看看问题出在哪里