找回密码
 立即注册
收起左侧

qtimer串口时间控制

3
回复
7823
查看
[复制链接]
累计签到:9 天
连续签到:1 天
来源: 2014-4-9 15:32:40 显示全部楼层 |阅读模式
5Qter豆
我程序里面qt上位机向电路发送命令,然后需要在有效的时间对串口接收到得电路反馈进行处理。但是我用qtime类写出来的是一个死循环。不知道哪里写错了,或者谁有更好的解决办法,请不灵赐教,小弟感激不尽。
        timer = new QTimer(this);
        timerFlag =false;
        endFlag=false;
        reapt.clear();
        connect(timer,SIGNAL(timeout()),this,SLOT(timerDone()));
        timer->start(1000);
        
        while(1)
        {
            if(timerFlag == true)break;//超时退出
            if(endFlag == true)
            {
                timer->stop();
                disconnect(timer,SIGNAL(timeout()),this,SLOT(timerDone()));
                delete timer;
            }
        }
        
        //if(endFlag == true)
        {
            insertRow(currentRow);
            {
                reapt.remove(0,2);
                QTableWidgetItem *deciveNameItem = new QTableWidgetItem(reapt);
                setItem(currentRow,0,deciveNameItem);           //设备名称
                QTableWidgetItem *portNameItem = new QTableWidgetItem(info.portName());
                setItem(currentRow,1,portNameItem);             //端口名称
                QTableWidgetItem *descriptionItem = new QTableWidgetItem(info.description());
                setItem(currentRow,2,descriptionItem);          //端口类型
                QTableWidgetItem *BusyItem = new QTableWidgetItem((info.isBusy() ? QObject::tr("Yes") : QObject::tr("No")));
                setItem(currentRow,3,BusyItem);                 //端口状态
                currentRow++;
            }
        }

        myCom->close();         //关闭串口
        delete myCom;           //垃圾回收


void ConnectDialog::readMyCom()//读串口函数
{
    QByteArray temp;
    temp = myCom->readAll();

    if(!((temp.isEmpty())|(temp.isNull())))
    {
        reapt.append(QString(temp));

        if((!reapt.startsWith("Ok"))&&(reapt.size()>=2))reapt.clear();
        if(reapt.endsWith('\n'))endFlag = true;
    }
}

void ConnectDialog::timerDone()//超时处理函数
{
    timerFlag=true;
    disconnect(timer,SIGNAL(timeout()),this,SLOT(timerDone()));
    delete timer;
}

最佳答案

查看完整内容

camelback5兄: 因为从你讲的和写的程序,暂无法看出上位机需对下位机的电路反馈信号是如何处理的, 是要求同步处理,或是要求异步处理? 我们的做法是: 1、如果不需要实时处理下位机电路反馈信号,允许有一定的延时的此类工作环境, 我们会采取间隔一定时长进行处理方式,具体如下: delayTime = 2 ; // 延迟2秒 while(1) { // 进入循环 /* 延迟 delayTime 指定的秒数 */ QElapsedTimer TL_t; ...
回复

使用道具 举报

尚未签到

2014-4-9 15:32:41 显示全部楼层
camelback5兄:
   因为从你讲的和写的程序,暂无法看出上位机需对下位机的电路反馈信号是如何处理的,
是要求同步处理,或是要求异步处理?
   我们的做法是:
1、如果不需要实时处理下位机电路反馈信号,允许有一定的延时的此类工作环境,
我们会采取间隔一定时长进行处理方式,具体如下:
delayTime = 2 ;   // 延迟2秒
while(1)
{    // 进入循环
       /* 延迟 delayTime 指定的秒数 */
       QElapsedTimer TL_t;
       TL_t.start();
        while((TL_t.elapsed())< (delayTime * 1000))
        {
               QCoreApplication::processEvents();
         }     
}
// 下面是您处理下位机电路的语句;
2、若需要实时处理,则采取轮询方式:将您要处理下位机电路的语句,放入QCoreApplication::processEvents();之后,
若循环结束下位机电路依然没有反馈,则最后进入你的
错误逻辑处理模块。

希望对您有所帮助。
祝好运。
begboy

点评

嗯,谢谢,你的方法也是可行的。不过我后来用的方法要相对复杂一些。我把等待一定时间接受串口数据的过程写成了一个对话框类。连接QTimer类得timeout槽,连接串口的读写槽。这样都读到有效的信息或者超时,关闭对话  详情 回复 发表于 2014-4-23 07:59
回复

使用道具 举报

累计签到:9 天
连续签到:1 天
2014-4-23 07:59:00 显示全部楼层
begboy 发表于 2014-4-14 13:59
camelback5兄:
   因为从你讲的和写的程序,暂无法看出上位机需对下位机的电路反馈信号是如何处理的,
是 ...

嗯,谢谢,你的方法也是可行的。不过我后来用的方法要相对复杂一些。我把等待一定时间接受串口数据的过程写成了一个对话框类。连接QTimer类得timeout槽,连接串口的读写槽。这样都读到有效的信息或者超时,关闭对话框就好。
之前的程序主要是对信号槽理解的错误,以为可以像单片机那样从while(1)里面去中断执行。
回复

使用道具 举报

尚未签到

2014-4-23 10:59:28 显示全部楼层
camelback5兄:
   不客气。
   您的方法比我更胜一筹!
   begboy
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了