我使用串口与装置进行通讯,通讯过程中,突然装置重启,或与装置之间的串口连接突然中断导致我的软件无法在中断连接之前关闭这个已经打开的串口句柄,从而使我想再次打开该串口时,显示该串口已经被占用而无法打开。不知道各位有没有好的解决方案呀。。谢谢了

解决方案 »

  1.   

    是通讯过程中突然断开的这个时候串口是打开的,在一段时间没收到数据后,认为串口的连接断开了,
    关闭原先打开的HANDLE,却发现关闭后再也无法初始化该串口并打开了。。有兴趣的TX可以试一下,用串口助手,先打开该串口,然后拨掉串口线,
    点击串口助手中的关闭串口,这个时候,你会发现这个串口关不了了重新插上串口线后,还是没办法关闭或是打开该串口了
      

  2.   

    突然中断是可以检测到的
    我是这么做的
    你参考一下
    void CWEComm::ThreadReceive(CWEComm* pOwner)
    {
    if(!SetCommMask(pOwner->m_hComm, EV_RXCHAR|EV_ERR))
    return; COMSTAT statCom;
    DWORD dwError, dwLen, dwMask; while(pOwner->m_bIsRece && pOwner->IsOpen())
    {
    dwMask = 0;
    if(!WaitCommEvent(pOwner->m_hComm, &dwMask, &pOwner->m_olWait))
    {
    switch(GetLastError())
    {
    case ERROR_ACCESS_DENIED:
    {
    pOwner->m_bIsRece = FALSE;
    pOwner->m_hThreadRec = NULL; SetCommMask(pOwner->m_hComm, 0);
    ResetEvent(pOwner->m_olWait.hEvent);
    CloseHandle(pOwner->m_hThreadRec);
    pOwner->Close();
    }break;
    case ERROR_IO_PENDING:GetOverlappedResult(pOwner->m_hComm, &pOwner->m_olWait, &dwLen, true);break;
    }
    } if(dwMask & EV_ERR)
    ClearCommError(pOwner->m_hComm, &dwError, &statCom); if(dwMask & EV_RXCHAR)
    {
    ClearCommError(pOwner->m_hComm, &dwError, &statCom);
    if(statCom.cbInQue>0)
    ::SendMessage(pOwner->m_hNotifyWnd, pOwner->m_uMsgID, statCom.cbInQue, 0);
    }
    }
    }
    case ERROR_ACCESS_DENIED:
    这个分支就是处理失去连接的
      

  3.   

    // ClearCommError()
    // CloseHandle()
      

  4.   

    // reset RTS
    EscapeCommFunction(m_idComDev,CLRRTS);
    //  close Comm
    PurgeComm(m_idComDev,PURGE_TXABORT | PURGE_RXABORT|
     PURGE_TXCLEAR | PURGE_RXCLEAR);
    // 
    CloseHandle(m_idComDev);
      

  5.   


    呃。。这是指COM1才是这样的吧其它COM口不一样啊。。而且我这个还是USB转的COM口所以才会出现我所说的无法关闭的问题。。
    上周出去了,,明天就试试大家的做法