现在跟一个串口设备进行通讯,也就是我发一个字符串过去,它显示一个状态信息。在Debug模式下,正确发送之后,无法取到回显的信息。使用Debug人工调试的时候,可以正常工作。因此怀疑是否是因为串口设备反应过慢,使用了一个异步IO访问串口。这个代码是我偷懒直接从网络上拿来的,但看起来并没有什么问题。代码示意如下:    DWORD lrc;                                 ///纵向冗余校验
    DWORD endtime;                            /////////jiesuo
    static OVERLAPPED ol;
    int ReadNumber=0;    
    int numCount=0 ;                             //控制读取的数目
    DWORD dwErrorMask,nBytesRead;
    COMSTAT comstat;    
    ol.Offset=0;                            ///相对文件开始的字节偏移量
    ol.OffsetHigh=0;                        ///开始传送数据的字节偏移量的高位字,管道和通信时调用进程可忽略。
    ol.hEvent=NULL;                         ///标识事件,数据传送完成时设为信号状态
    ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);    
    endtime=GetTickCount()+ReadTime;//GetTickCount()取回系统开始至此所用的时间(毫秒) 
    Sleep(ReadTime);
    ClearCommError(m_hCom,&dwErrorMask,&comstat);
    size=min(2000,comstat.cbInQue);  
    if(int(size)<2) 
        goto Loop;
while(1)
{
if(!ReadFile(m_hCom,inbuff,size,&nBytesRead,&ol))
{    
if((lrc=GetLastError())==ERROR_IO_PENDING)
{
///////////////////
endtime=GetTickCount()+ReadTime;//取回系统开始至此所用的时间(毫秒)
while(!GetOverlappedResult(m_hCom,&ol,&nBytesRead,FALSE))//该函数取回重叠操作的结果
{
if(GetTickCount()>endtime)
break;
}    
}        
}
}
    return 1;    
Loop:  
return 0;可是只要不是调试,从来都读不到串口里面的内容,而使用调试默认,人工单步执行,次次都OK。
我不知道问题在哪里,还请各位大大们解惑

解决方案 »

  1.   

    上面的代码有误。DWORD lrc;                                 ///纵向冗余校验
        DWORD endtime;                            /////////jiesuo
        static OVERLAPPED ol;
        int ReadNumber=0;    
        int numCount=0 ;                             //控制读取的数目
        DWORD dwErrorMask,nBytesRead;
        COMSTAT comstat;    
        ol.Offset=0;                            ///相对文件开始的字节偏移量
        ol.OffsetHigh=0;                        ///开始传送数据的字节偏移量的高位字,管道和通信时调用进程可忽略。
        ol.hEvent=NULL;                         ///标识事件,数据传送完成时设为信号状态
        ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);    
        endtime=GetTickCount()+ReadTime;//GetTickCount()取回系统开始至此所用的时间(毫秒) 
        Sleep(ReadTime);
        ClearCommError(m_hCom,&dwErrorMask,&comstat);
        size=min(2000,comstat.cbInQue);  
        if(int(size)<2) 
            goto Loop; if(!ReadFile(m_hCom,inbuff,size,&nBytesRead,&ol))
    {    
    if((lrc=GetLastError())==ERROR_IO_PENDING)
    {
    ///////////////////
    endtime=GetTickCount()+ReadTime;//取回系统开始至此所用的时间(毫秒)
    while(!GetOverlappedResult(m_hCom,&ol,&nBytesRead,FALSE))//该函数取回重叠操作的结果
    {
    if(GetTickCount()>endtime)
    break;
    }    
    }        
    }    return 1;    
    Loop:  
    return 0;
      

  2.   

    代码中 ReadTime 的只给的是多少?这是一个超时值,太短就可能收不到(单步执行时间肯定比较长,能拿到数据也很合理)