没有报错,调试时发现在监听串口时,发现串口线程进入了死锁状态,就是一直在死等返回消息。代码如下:unsigned long WINAPI TSerialPort::CommThread(LPVOID Param)
{
TSerialPort *Port = (TSerialPort *)Param;
if (NULL == Port)
{
ExitThread(0);
} if (INVALID_HANDLE_VALUE == Port->m_Comm)
{
ExitThread(0);
} Port->m_ThreadAlive = true; unsigned long Event = 0;
unsigned long CommEvent = 0;
unsigned long Error = 0;
COMSTAT Comstate;
bool Result = true; PurgeComm(Port->m_Comm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
while(1)
{
Result = WaitCommEvent(Port->m_Comm, &Event, &Port->m_Overlapped);
if (Result)
{
Result = ClearCommError(Port->m_Comm, &Error, &Comstate);
if (Comstate.cbInQue == 0)
{
continue;
}
}
else
{
Error = GetLastError();
} Event = WaitForMultipleObjects(3, Port->m_EventArray, false, INFINITE);
switch(Event)
{
case 0:
Port->m_ThreadAlive = false;
ExitThread(0);
break;
case 1:
GetCommMask(Port->m_Comm, &CommEvent);
if (CommEvent & EV_RXCHAR)
{
ReceiveChar(Port, Comstate);
}
break;
case 2:
SendChar(Port);
break;
}
}
return 0;
}
{
TSerialPort *Port = (TSerialPort *)Param;
if (NULL == Port)
{
ExitThread(0);
} if (INVALID_HANDLE_VALUE == Port->m_Comm)
{
ExitThread(0);
} Port->m_ThreadAlive = true; unsigned long Event = 0;
unsigned long CommEvent = 0;
unsigned long Error = 0;
COMSTAT Comstate;
bool Result = true; PurgeComm(Port->m_Comm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
while(1)
{
Result = WaitCommEvent(Port->m_Comm, &Event, &Port->m_Overlapped);
if (Result)
{
Result = ClearCommError(Port->m_Comm, &Error, &Comstate);
if (Comstate.cbInQue == 0)
{
continue;
}
}
else
{
Error = GetLastError();
} Event = WaitForMultipleObjects(3, Port->m_EventArray, false, INFINITE);
switch(Event)
{
case 0:
Port->m_ThreadAlive = false;
ExitThread(0);
break;
case 1:
GetCommMask(Port->m_Comm, &CommEvent);
if (CommEvent & EV_RXCHAR)
{
ReceiveChar(Port, Comstate);
}
break;
case 2:
SendChar(Port);
break;
}
}
return 0;
}
解决方案 »
- AfxMessageBox(TEXT("注意安全!")) 和AfxMessageBox("注意安全");
- Navigate2函数在Vista上的问题
- 我用向导生成了一个单文档程序,当窗口小于一定大小时就有滚动条出现,现想去掉滚动条,请问大侠该怎么做?
- 关于Modem指令的一个错误提示,该怎么办
- 请大家帮助我1下,我在Debug下编译成功,在Release下失败
- 给巨分-关于setup factory 6自动建ODBC!
- 如何在WebBrowser打开的网页链接后直接在WebBrowser打开而不是新弹出一个IE窗口来打开
- 请问如何才能知道MODEM的当前状态?
- vc中如何调用COM接口?
- 请问:在树视里如何区分鼠标右键按下的是一个条目还是空白区?
- vs2010中,使用Start Debugging运行和Start Without Debugging运行有什么区别?
- Socket实现跨外网通信的问题
是不是应该写成
while(Port->m_ThreadAlive)
{
TSerialPort *Port = (TSerialPort *)Param;
if (NULL == Port)
{
ExitThread(0);
} if (INVALID_HANDLE_VALUE == Port->m_Comm)
{
ExitThread(0);
} Port->m_ThreadAlive = true; unsigned long Event = 0;
unsigned long CommEvent = 0;
unsigned long Error = 0;
COMSTAT Comstate;
bool Result = true; if( Port->m_Comm )
PurgeComm(Port->m_Comm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
while(1)
{
Result = WaitCommEvent(Port->m_Comm, &Event, &Port->m_Overlapped);
if (Result)
{
Result = ClearCommError(Port->m_Comm, &Error, &Comstate);
if (Comstate.cbInQue == 0)
{
continue;
}
}
else
{
switch (Error = GetLastError())
{
case ERROR_IO_PENDING:
{
// This is a normal return value if there are no bytes
// to read at the port.
// Do nothing and continue
break;
}
case 87:
{
// Under Windows NT, this value is returned for some reason.
// I have not investigated why, but it is also a valid reply
// Also do nothing and continue.
break;
}
default:
{
// All other error codes indicate a serious error has
// occured. Process this error.
Port->ProcessErrorMessage("WaitCommEvent()");
break;
}
}
} Event = WaitForMultipleObjects(3, Port->m_EventArray, false, INFINITE);
switch(Event)
{
case 0:
Port->m_ThreadAlive = false;
ExitThread(0);
break;
case 1:
GetCommMask(Port->m_Comm, &CommEvent);//-------1
if (CommEvent & EV_RXCHAR) //如果屏蔽这句,用标准串口能接收到数据,但
{ //即使接收到了,依旧在“1”中死循环。
ReceiveChar(Port, Comstate);
}
break;
case 2:
SendChar(Port);
break;
}
}
return 0;
}
有可能不是你的程序死掉了。而是在漫长的等待中。INFINITE这个可是不小的一个数,而且你没有超时响应。