问一个串口通讯方面的怪问题,你碰到过吗?

Daniel22_cn 2005-04-15 06:43:55
现在跟一个串口设备进行通讯,也就是我发一个字符串过去,它显示一个状态信息。

在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。
我不知道问题在哪里,还请各位大大们解惑
...全文
177 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jammyxu 2005-04-19
  • 打赏
  • 举报
回复
我只用WinAPI
Daniel22_cn 2005-04-19
  • 打赏
  • 举报
回复
2秒钟。我觉得这个反应速度已经足够了。。
Daniel22_cn 2005-04-18
  • 打赏
  • 举报
回复
顶一下,怎么没人回答呢?
seaquester 2005-04-18
  • 打赏
  • 举报
回复
代码中 ReadTime 的只给的是多少?这是一个超时值,太短就可能收不到(单步执行时间肯定比较长,能拿到数据也很合理)
Daniel22_cn 2005-04-15
  • 打赏
  • 举报
回复
上面的代码有误。

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,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧