Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2351573
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:03:46

我在程序中使用了您的串口控件,由于单片机返回数据的过程较慢,而且要分次送出,为避免循环等待,因此我响应了控件的OnPackage事件,并且利用PostMessage转移到主线程里面(WndProc())来处理接收到的数据并作一些显示绘图的工作,这一过程没有问题。

不过由于有些命令发送之后,需要单片机立即回复,PC机才能决定是重发该命令还是转入其他的处理过程,因此我有用了如下的方式:(也是您以前提到过的方法)

某菜单项响应函数
{
    发送命令();
     for(i=0; i     {
          if((nBytes=YbCommDevice1->ReadPackage(RecBuf,BufSize))>0)
          break;
          Sleep(10);
     }
     if(i == nTimeOut)
     {
          出错处理;
     }
     else
     {
          单片机回复正确;
     }
}

我现在的问题是:在循环等待的过程中,会不会发生控件发出OnPackage消息的情况,这个消息会不会放入消息循环中等待WndProc的处理。如果在循环等待过程中接收到了多帧数据,会发生什么情况?

我不知道表达的是否清楚,PC机和MCU之间的控制流程大概是这样:
PC机发命令,等待单片机回复;超时未回复,重发(重发次数有上限);一旦收到对命令的正确回复,就转入等待状态接收数据。





--------------------next---------------------
某菜单项响应函数
{
     发送命令();
     for(i=0; i     {
          if((nBytes=YbCommDevice1->ReadPackage(RecBuf,BufSize))>0)
          break;
          Sleep(10);
     }
     if(i == nTimeOut)
     {
          ShowMessage("Commu Failed!");
     }
     else
     {
          ShowMessage("Commu Success!");
          其他处理();
     }
}

我发现,当ShowMessage窗口弹出时,如果不按下OK按钮,控件还是会响应OnPackage消息,我想是因为该消息响应函数在另一个线程里,可是主线程还是进行了WndProc的处理(处理接收的数据并显示),可是当前的消息响应还没有结束,这是怎么回事?
难道WndProc会打断其他正在处理的消息响应函数吗?
后来我试了试在该响应函数的最后加入了一个无限循环(这时单片机已经开始发送数据了),发现显示部分不工作了。这到底是因为WndProcde没有响应,还是因为响应了但来不及处理显示。(因为有一个while(1)的无限循环)。

--------------------next---------------------
Windows 没有中断,Windows 的消息在一个队列里面,先产生的消息先执行,等执行完成之后再执行下一个消息。

如果在响应一个消息的时候有一个长时间循环,里面用 Application->ProcessMessages() 可以执行消息队列的下一条消息,看起来是响应了 Windows 的消息,让 Windows 认为不是对系统停止反应。这种不是打断程序,而是程序要主动调用下一个消息。

Windows 在同一个程序里面可以同时运行的函数是线程。两个线程是同时运行的,不能互相打断。如果要打断另一个线程,可以在一个线程里面把要打断的线程挂起,这和响应消息有些类似,这个是用程序挂起另一个线程。

串口的事件在线程里面,所以会在响应其它消息的时候执行,不影响实时处理数据,也不会打断其它事件和消息。

--------------------next---------------------
我根据您的建议已经修改了程序,达到了目的,可以控制OnPackge()函数在需要的时候才PostMessage到主线程,非常感谢!
就是不太理解下面的情况:
某菜单项响应函数
{
    【标识】=true;
    发送命令();
     for(i=0; i     {
          if((nBytes=YbCommDevice1->ReadPackage(RecBuf,BufSize))>0)
          break;
          Sleep(10);
     }
     【标识】=false;

     ShowMessage("***");   //显示一条信息
     //Other Process
}
当用ShowMessage弹出一个对话框,如果我不按下OK键,按理说该菜单响应函数还没有完成吧,可是WndProc已经接收了OnPackage post过来的消息,开始处理数据和显示,当我按下OK之后,才会执行ShowMessage()后面的其他处理,就好像该菜单响应函数被打断一样。
难道Application->ProcessMessages() 是系统自己调用的吗?还是ShowMessage()有什么特别的地方。

PS:我想您肯定是大忙人,真的不好意思用这么简单的问题麻烦您,可是不搞清楚,总不痛快,请理解。
从您对菜鸟的态度,可以看出您是个真正的高手!




--------------------next---------------------

阅读(1049) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~