查看完整版本: [-- QApplication::processEvents();在串口接收循环中使用,对吗? --]

QTCN开发网 -> Qt嵌入式开发 -> QApplication::processEvents();在串口接收循环中使用,对吗? [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

ycgxy1650601 2017-09-15 19:08

QApplication::processEvents();在串口接收循环中使用,对吗?


void MainWindow::SendFrame(char *n, bool m)   //发送函数
{
    
}
void MainWindow::slotReceiveData()   //串口接收函数
{
     uchar res;
     while(p_serial_port->read((char*)&res,1)>0)
     {              
         switch(frame_data[1])
         {
            case 1:
            {
               send_frame = Y;
               break;
            }
            case 2:
            {
                 SendFrame(n,m);        
                 while(send_frame!=Y)
                 {
                     //程序死在这里,出不来了
                    QApplication::processEvents();   //循环等待
                }              
                break;
            }            
         }                                      
     }
}
在串口接收函数slotReceiveData(),使用QApplication::processEvents(); 上位机和下位机进行通信,case2上位机发送数据给下位机(SendFrame(n,m)),下位机应答case1返回,从而确认数据已经发出;但是像上面这样使用QApplication::processEvents(),是不是造成递归调用?现在程序死在while()循环中,请教大家:我的代码有问题吗?有什么办法解决吗,谢谢!

lanliuyi61 2017-09-19 15:50
你的case1是收到返回信息的情况是吧?
case2是没收到,就一直发是吧?

但你的while里没有延迟啊,至少sleep以下吧,一直发很累的。

而且用waitforreadyread不好么?

嫌阻塞的话,用计时器也可以。

ycgxy1650601 2017-09-19 22:06
lanliuyi61:你的case1是收到返回信息的情况是吧?
case2是没收到,就一直发是吧?
但你的while里没有延迟啊,至少sleep以下吧,一直发很累的。
....... (2017-09-19 15:50) 

      总体结构就是:case2 分支负责发送数据,假如发送成功,下位机会上发到case1,从而使得send_frame=Y;然后返回到case2中进行while()的条件判断(while()循环里面有QApplication::processEvents();),最后退出。我就是不明白是不是QApplication::processEvents();用的不对啊。
      waitforreadyread没用过,我去找找。

ycgxy1650601 2017-09-19 23:30
lanliuyi61:你的case1是收到返回信息的情况是吧?
case2是没收到,就一直发是吧?
但你的while里没有延迟啊,至少sleep以下吧,一直发很累的。
....... (2017-09-19 15:50)

我网上查了一下waitforreadyread(阻塞,直到输出通道中的新数据可读),如果用这个函数,上位机界面上同时产生的其他事件处理不了?

lanliuyi61 2017-09-20 09:33
ycgxy1650601:      总体结构就是:case2 分支负责发送数据,假如发送成功,下位机会上发到case1,从而使得send_frame=Y;然后返回到case2中进行while()的条件判断(while()循环里面有QApplication::processEvents();),最后退出。我就是不明白是不是QApplicati .. (2017-09-19 22:06)

你具体的情况我不好分析,建议你自己用DEBUG一句一句的看。

另外,不想阻塞的话就用定时器。

慢慢学,多看例子。

再另外,注意到你是在网上找到的waitreadyread。  你应该不会用的QT自带的帮助文档,对着随便一个类的名字按F1试试吧。

ycgxy1650601 2017-09-20 09:38
lanliuyi61:你具体的情况我不好分析,建议你自己用DEBUG一句一句的看。
另外,不想阻塞的话就用定时器。
....... (2017-09-20 09:33) 

好的,谢谢!


查看完整版本: [-- QApplication::processEvents();在串口接收循环中使用,对吗? --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled