1,221
社区成员
发帖
与我相关
我的任务
分享
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;
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:
{
break;
}
case 87:
{
break;
}
default:
{
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);
if (CommEvent & EV_RXCHAR) //如果屏蔽掉这句,能够接收到完整的数据包;
{ //但是接收完后还在这里死循环,不解。。。
//如果不屏蔽,就在这里死循环。
ReceiveChar(Port, Comstate);
}
break;
case 2:
SendChar(Port);
break;
}
}
return 0;
}