如何让程序等待Cserialport串口类接收所有数据

summerea 2010-06-07 11:53:07
我操作的仪器返回值中有"OK"作为结束标志,并且需要好几秒才能返回所有数据。所以我在程序运行过程中必须等待oncomm函数接受数据,并且判断收到"OK"才能继续向下运行程序。我写了个判断的函数,可是总是进入死循环,烦请大家帮我看看哪,谢谢了!!

//这个是接受数据的oncomm函数,predata保存上一个数据
void CSpectResponceDlg::OnComm(WPARAM ch,LPARAM port)
{
if (preData=='O'&&ch=='K') commOkFlag=1;
preData=ch;
}

//这个是向串口写数据(向仪器发送命令)
CString m_strSend;
m_strSend="?\r";
m_serialPort.WriteToPort(m_strSend.GetBuffer(m_strSend.GetLength()));

if (!Is7iswOk()) //马上运行这个函数判断仪器返回是否成功
{
MessageBox("通讯超时,请检查设备!",MB_OK);
return;
}

//下面这个就是我烦了很久的问题,是我判断仪器返回是否成功的代码,想破头都没弄明白哪里出错,总是进入死循环
int CSpectResponceDlg::Is7iswOk()
{
int i=0;
while (!commOkFlag)
{
Sleep(60);
i++;
if(i==2000) return 0; //2分钟还没搞定的话超时返回
}
commOkFlag=0;
return 1;
}
...全文
257 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gdtyy 2010-08-02
  • 打赏
  • 举报
回复
用这个监视一下数据
see link below:

下载地址:
http://download.cnet.com/ComTrace/3000-2218_4-75156892.html?tag=mncol

感觉好别忘了给个review(评论),谢谢!
summerea 2010-06-07
  • 打赏
  • 举报
回复
求大虾...
summerea 2010-06-07
  • 打赏
  • 举报
回复
串口是一直在读数据的,刚有人说用volatile修饰下commOkFlag,我试了下有效果,可不是很稳定,还是很困扰
summerea 2010-06-07
  • 打赏
  • 举报
回复
commOkFlag 初值是0啊
wendysen 2010-06-07
  • 打赏
  • 举报
回复
commOkFlag赋的初值?
wendysen 2010-06-07
  • 打赏
  • 举报
回复
我觉得你的逻辑有错误。
你的串口是一直有数据读入的对吗?如果不是“ok"结束标志,
while (!commOkFlag)
{
Sleep(60);
i++;
if(i==2000) return 0; //2分钟还没搞定的话超时返回
}

也是一直执行的,串口收到一个字符,就执行一次int CSpectResponceDlg::Is7iswOk(),而且返回0值。

你可以监视一下串口收到的每一个数据...

2,640

社区成员

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

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