• 4020阅读
  • 5回复

[提问]QApplication::processEvents();在串口接收循环中使用,对吗? [复制链接]

上一主题 下一主题
离线ycgxy1650601
 

只看楼主 倒序阅读 楼主  发表于: 2017-09-15

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

只看该作者 1楼 发表于: 2017-09-19
你的case1是收到返回信息的情况是吧?
case2是没收到,就一直发是吧?

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

而且用waitforreadyread不好么?

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

只看该作者 2楼 发表于: 2017-09-19
回 lanliuyi61 的帖子
lanliuyi61:你的case1是收到返回信息的情况是吧?
case2是没收到,就一直发是吧?
但你的while里没有延迟啊,至少sleep以下吧,一直发很累的。
....... (2017-09-19 15:50) 

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

只看该作者 3楼 发表于: 2017-09-19
回 lanliuyi61 的帖子
lanliuyi61:你的case1是收到返回信息的情况是吧?
case2是没收到,就一直发是吧?
但你的while里没有延迟啊,至少sleep以下吧,一直发很累的。
....... (2017-09-19 15:50)

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

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

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

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

慢慢学,多看例子。

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

只看该作者 5楼 发表于: 2017-09-20
回 lanliuyi61 的帖子
lanliuyi61:你具体的情况我不好分析,建议你自己用DEBUG一句一句的看。
另外,不想阻塞的话就用定时器。
....... (2017-09-20 09:33) 

好的,谢谢!
快速回复
限100 字节
 
上一个 下一个