关于串口句柄的关闭,不知道大家有没有解决方法 我使用串口与装置进行通讯,通讯过程中,突然装置重启,或与装置之间的串口连接突然中断导致我的软件无法在中断连接之前关闭这个已经打开的串口句柄,从而使我想再次打开该串口时,显示该串口已经被占用而无法打开。不知道各位有没有好的解决方案呀。。谢谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是通讯过程中突然断开的这个时候串口是打开的,在一段时间没收到数据后,认为串口的连接断开了,关闭原先打开的HANDLE,却发现关闭后再也无法初始化该串口并打开了。。有兴趣的TX可以试一下,用串口助手,先打开该串口,然后拨掉串口线,点击串口助手中的关闭串口,这个时候,你会发现这个串口关不了了重新插上串口线后,还是没办法关闭或是打开该串口了 突然中断是可以检测到的我是这么做的你参考一下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:这个分支就是处理失去连接的 // ClearCommError()// CloseHandle() // reset RTS EscapeCommFunction(m_idComDev,CLRRTS);// close Comm PurgeComm(m_idComDev,PURGE_TXABORT | PURGE_RXABORT| PURGE_TXCLEAR | PURGE_RXCLEAR);// CloseHandle(m_idComDev); 呃。。这是指COM1才是这样的吧其它COM口不一样啊。。而且我这个还是USB转的COM口所以才会出现我所说的无法关闭的问题。。上周出去了,,明天就试试大家的做法 C++修改XML问题 如何改变check box上的内容?//传下代码 如何消除com组件的依赖? MFC中的Picture控件 VFW作视频采集,是不是只是针对不带采集卡的摄像头的阿? 如果配有专门的采集卡 是不是不能使用VFW? 大家来评评大学的教育 VC可以编写C程序并编译成exe吗? 为什么非模态对话框浮在最上面?(在线等待) RegQueryValueEx怎么用啊? odbc问题:何时使用CRecordSet子类的Open和Close函数?一开始的状态是Open还是Close? 又见黄花开 求图片显示算法
关闭原先打开的HANDLE,却发现关闭后再也无法初始化该串口并打开了。。有兴趣的TX可以试一下,用串口助手,先打开该串口,然后拨掉串口线,
点击串口助手中的关闭串口,这个时候,你会发现这个串口关不了了重新插上串口线后,还是没办法关闭或是打开该串口了
我是这么做的
你参考一下
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:
这个分支就是处理失去连接的
// CloseHandle()
EscapeCommFunction(m_idComDev,CLRRTS);
// close Comm
PurgeComm(m_idComDev,PURGE_TXABORT | PURGE_RXABORT|
PURGE_TXCLEAR | PURGE_RXCLEAR);
//
CloseHandle(m_idComDev);
呃。。这是指COM1才是这样的吧其它COM口不一样啊。。而且我这个还是USB转的COM口所以才会出现我所说的无法关闭的问题。。
上周出去了,,明天就试试大家的做法