没有报错,调试时发现在监听串口时,发现串口线程进入了死锁状态,就是一直在死等返回消息。代码如下: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;
}

解决方案 »

  1.   

    while循环怎么退出来呢?
    是不是应该写成
    while(Port->m_ThreadAlive)
      

  2.   

    谢谢亲们的热心回复,我这个串口线程在平时工作都好好的,即使没有捕获到串口数据线程也会退出。楼上说我的while循环需要更改为while(Port->m_ThreadAlive),但是问题是,串口一直都是打开的,线程我也加了个判断,更改如下: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:    
                    {   
                        // 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;
    }
      

  3.   

    以前的通讯工装都是通过九针的串口接头来连接,这样可以通过短接的方式进行自发自收的测试。我们现在的工装就是直接用普通的USB接口连接电脑,方形的标准usb接口连接通讯工装,无需电源,通过MBUS通讯方式直接与被检设备连接。我用低版本的串口助手也出现与我同样的问题,高版本的就没事了,估计还是串口线程的问题,可是一直找不到问题点所在
      

  4.   

    赞成。
    有可能不是你的程序死掉了。而是在漫长的等待中。INFINITE这个可是不小的一个数,而且你没有超时响应。
      

  5.   

    我估计可能是USB转串口的问题,性能不太稳定