VC++循环采集显示问题====各位大侠帮忙

研究是为了理解
博客专家认证
2010-05-23 09:09:33
我是搞嵌入式的,因为毕业设计要做一个上位机软件接收USB传来的数据:我设了一个按钮叫"采集数据",我想按下它之后,在它的响应函数里循环读取USB端口数据,然后用Edit Box控件显示,现在的问题是,如果不加while(1)无限循环,只是读一次显示一次,是正常的,但一加while循环,edit box就再也不显示了.
好像是按下"数据采集"之后,要等本次按键程序全部结束后,才更新Edit Box的内容,我想实时更新,有什么办法?

这是"开始采集"按钮的响应函数:关键是,在执行死循环后,Edit box控件不更新内容,必须等到这个响应函数结束后才更新内容.

void CUsbIICRWDlg::OnButtonup()
{

unsigned char buf[100];//USB接收数据缓冲
m_bt.SetWindowText("停止采集");
UpdateData(TRUE);
char cc[10]; //浮点数转字符型的缓存
double a; //定义浮点变量
while(1)//开始死循环
{

if(ReadPort2(buf,64)!=0)//接收usb端口的数据
{
MessageBox((LPCSTR)"读端口2失败!", "提示", MB_ICONSTOP);
return;
}

for( i=0;i<64;i++)//usb端口共64字节数据,处理64次
{
a=(double)buf[i]/51;
gcvt(a, 3, cc); //浮点数转字符型

m_strUp=cc;//将字符给Edit Box控件

UpdateData(FALSE); //更新控件,关键是,在while循环中,Edit Box并未更新
}
Sleep(300);//延时
}
}
...全文
246 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-05-31
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
dinjay 2010-05-23
  • 打赏
  • 举报
回复
你可以将读取的循环在消息处理函数中进行,只要定义一个消息,然后postmessage给你定义的消息ID,然后让消息去处理函数做就行了,post是非阻塞的,不会影响你干别的
wltg2001 2010-05-23
  • 打赏
  • 举报
回复
是读一次显示一次,是正常的,但一加while循环,edit box就再也不显示了.
好像是按下"数据采集"之后,要等本次按键程序全部结束后,才更新Edit Box的内容,我想实时更新,有什么办法?
==========================
因为while(1)阻塞住了消息循环,要不你开个线程在线程中接收数据,要不你在while中加入消息循环,写一个while(GetMessage(....))
nabela123 2010-05-23
  • 打赏
  • 举报
回复
循环线程。
wltg2001 2010-05-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhzht19861011 的回复:]
二楼三楼可以说的详细点吗?我对于VC的线程一无所知,能不能给举个例子.
[/Quote]
不了解多线程你就不用多线程就是了,在while的加就行了:代码如下,注意红色部分
void CUsbIICRWDlg::OnButtonup()
{

unsigned char buf[100];//USB接收数据缓冲
m_bt.SetWindowText("停止采集");
UpdateData(TRUE);
char cc[10]; //浮点数转字符型的缓存
double a; //定义浮点变量
while(1)//开始死循环
{

if(ReadPort2(buf,64)!=0)//接收usb端口的数据
{
MessageBox((LPCSTR)"读端口2失败!", "提示", MB_ICONSTOP);
return;
}

for( i=0;i<64;i++)//usb端口共64字节数据,处理64次
{
a=(double)buf[i]/51;
gcvt(a, 3, cc); //浮点数转字符型

m_strUp=cc;//将字符给Edit Box控件

if(::GetMessage(&msg,GetSafeHwnd(),0,0))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);

}


UpdateData(FALSE); //更新控件,关键是,在while循环中,Edit Box并未更新
}
Sleep(300);//延时
}
}
向立天 2010-05-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhzht19861011 的回复:]
二楼三楼可以说的详细点吗?我对于VC的线程一无所知,能不能给举个例子.
[/Quote]
多线程是要好好学学的
http://blog.csdn.net/celineshi/archive/2007/06/28/1670225.aspx
  • 打赏
  • 举报
回复
二楼三楼可以说的详细点吗?我对于VC的线程一无所知,能不能给举个例子.

15,979

社区成员

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

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