参考文章为我之前发的SerialPort类的编写:
https://blog.youkuaiyun.com/vae20017/article/details/104045914
本人在写串口调试程序的时候,用CSerialPort类打开串口后如果关闭,再次打开就无法打开该串口。利用GetlastError()发现错误代码是:5,也就是串口被占用。将程序全部退出再进入就可以打开占用串口,因此证明程序关闭串口失败,该串口还在被调用。
调试之后发现,如果只是初始化串口的话串口关闭无影响,但是只要调用监听线程StartMonitoring(),就会出错,因此证明监听线程阻塞,没有关闭,因此在ClosePort()里面看是如何关闭监听的:
void CSerialPort::ClosetoPort()
{
/*MSG message;
//增加线程挂起判断,解决由于线程挂起导致串口关闭死锁的问题 add by itas109 2016-06-29
if (IsThreadSuspend(m_Thread))
{
ResumeThread(m_Thread);
}
//串口句柄无效
if (m_hComm == INVALID_HANDLE_VALUE)
{
CloseHandle(m_hComm);
m_hComm = NULL;
return;
}
do
{
SetEvent(m_hShutdownEvent);
if (::PeekMessage(&message, this->m_hpOwner, 0, 0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
} while (m_bThreadAlive);
StopMonitoring();
// Close Handles
if (m_hShutdownEvent != NULL)
{
ResetEvent(m_hShutdownEvent);
}
if (m_ov.hEvent != NULL)
{
ResetEvent(m_ov.hEvent);
}
if (m_hWriteEvent != NULL)
{
ResetEvent(m_hWriteEvent);
//CloseHandle(m_hWriteEvent);//开发者反映,这里会导致多个串口工作时,重新打开串口异常
}
if (m_szWriteBuffer != NULL)
{
delete[] m_szWriteBuffer;
m_szWriteBuffer = NULL;
}
// if the port is still opened: close it
if (m_hComm != NULL)
{
CloseHandle(m_hComm);
m_hComm = NULL;
}
StopMonitoring();*/
MSG message;
//add by liquanhai 防止死锁 2011-11-06
do
{
SetEvent(m_hShutdownEvent);
if (::

在使用CSerialPort类进行串口通信时,遇到关闭串口后无法再次打开的问题,错误代码为5,表示串口被占用。通过分析发现,问题出在监听线程StartMonitoring(),其导致串口未正确关闭。进一步调试后,发现在关闭串口的事件处理中,句柄关闭顺序错误,调整顺序后成功解决了串口无法关闭和重开的问题。
最低0.47元/天 解锁文章
4277

被折叠的 条评论
为什么被折叠?



