现在跟一个串口设备进行通讯,也就是我发一个字符串过去,它显示一个状态信息。在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。
我不知道问题在哪里,还请各位大大们解惑
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。
我不知道问题在哪里,还请各位大大们解惑
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;