分享

关于串口句柄的关闭,不知道大家有没有解决办法

 落水成花 2015-05-03

关于串口句柄的关闭,不知道大家有没有解决办法

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

关于串口句柄的关闭,不知道大家有没有解决方法

我使用串口与装置进行通讯,通讯过程中,突然装置重启,或与装置之间的串口连接突然中断

导致我的软件无法在中断连接之前关闭这个已经打开的串口句柄,从而使我想再次打开该串口时,

显示该串口已经被占用而无法打开。

不知道各位有没有好的解决方案呀。。谢谢了

------解决方案--------------------
每次打开串口如果显示被占用就进行关闭,然后再次打开
------解决方案--------------------
打开之前做判断。。。。。
------解决方案--------------------
突然中断是可以检测到的
我是这么做的
你参考一下
C/C++ code
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);
        }
    }
}

------解决方案--------------------
我以前做过虚拟串口的驱动,
如果端口突然端口后驱动程序内还有资源没有释放,那么再次打开该端口可能打不开,提示被占用了。
如果是驱动的问题应该,如果硬件也是串口的话,应该可以解决的
------解决方案--------------------
// ClearCommError()
// CloseHandle()
------解决方案--------------------
// reset RTS
EscapeCommFunction(m_idComDev,CLRRTS);
// close Comm
PurgeComm(m_idComDev,PURGE_TXABORT | PURGE_RXABORT|
PURGE_TXCLEAR | PURGE_RXCLEAR);
// 
CloseHandle(m_idComDev);

(本文来自互联网,不代表搜站(http://www./)的观点和立场)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多