• 6326阅读
  • 6回复

[提问]之前写了个18B20的驱动,现在写了个界面想把数据显示出来,发现有几个问题 [复制链接]

上一主题 下一主题
离线caffee_1989
 
只看楼主 倒序阅读 楼主  发表于: 2011-04-12
我把代码贴出来,希望有人能帮忙看看,主要有3个问题
1、lcdnumber中能够实时显示数据,但label中只能显示最后一次采集的温度。
2、lcdnumber和label只显示整数,小数点后的都没显示,我好象把显示数据定义为double型了。
3、程序中我一共采集20次数据,再采集过程中点击quit和stop都不能响应,该怎么改善。

DS18B20.h(头文件

#ifndef FINDDIALOG_H
#define FINDDIALOG_H
#include <qwidget.h>
class QLabel;
class QString;
class QPushButton;
class QLCDNumber;
class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = 0, const char *name = 0);
    int fd;
    
private slots:
    void start();
    void stop();
private:
    QLabel *label;
    QString string;
    QPushButton *startbutton;
    QPushButton *stopbutton;
    QPushButton *quitbutton;
    QLCDNumber *lcdnumber;
};
#endif

DS18B20.cpp

#include <qcheckbox.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qlineedit.h>
#include <qpushbutton.h>
#include <qlcdnumber.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/fs.h>
#include <errno.h>
#include <string.h>
#include "DS18B20.h"
Widget::Widget(QWidget *parent, const char *name): QWidget(parent, name)
{
    setCaption(tr("DS18B20"));
     startbutton = new QPushButton(tr("start"),this);
     stopbutton = new QPushButton(tr("stop"),this);
     quitbutton = new QPushButton(tr("quit"),this);
     lcdnumber = new QLCDNumber(this);
     label = new QLabel("000",this);
    connect(startbutton,SIGNAL(clicked()),this,SLOT(start()));
    connect(stopbutton,SIGNAL(clicked()),this,SLOT(stop()));
    connect(quitbutton,SIGNAL(clicked()),this,SLOT(quit()));
  
    /*  布局  */
    QVBoxLayout *midLayout = new QVBoxLayout;
    midLayout->addWidget(label);
    midLayout->addWidget(lcdnumber);
    midLayout->addWidget(startbutton);
    midLayout->addWidget(stopbutton);
    midLayout->addWidget(quitbutton);
    
    QVBoxLayout *leftLayout = new QVBoxLayout;
    leftLayout->addStretch(1);
    
    QVBoxLayout *rightLayout = new QVBoxLayout;
    rightLayout->addStretch(1);
    
    QHBoxLayout *mainLayout = new QHBoxLayout(this);
    mainLayout->setMargin(11);
    mainLayout->setSpacing(6);
    mainLayout->addLayout(leftLayout);
    mainLayout->addLayout(midLayout);
    mainLayout->addLayout(rightLayout);
    
}
void Widget::start()
{
    fd = open("/dev/my_DS18B20",0);
    if (fd < 0)
    {
exit(1);
    }
    for(int i=0;i<20;i++)
    {
int tmp;
double res;
read(fd,&tmp,sizeof(tmp));
res = double(tmp/10);
        string = QString("%1 'C").arg(res);
        lcdnumber->display(double(res));
        label->setText(string);
        sleep(1);
}

//label->setNum(res);
    }
    //close(fd);
}
void Widget::stop()
{
    close(fd);
}

main.cpp

#include <qapplication.h>
#include "DS18B20.h"
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Widget *widget = new Widget;
    app.setMainWidget(widget);
    widget->show();
    return app.exec();
}

离线caffee_1989
只看该作者 1楼 发表于: 2011-04-12
本人刚学qt,希望能帮忙看看,可能对于大家只是很简单的事。
离线frog
只看该作者 2楼 发表于: 2011-04-12
不能在start()函数中,写这段代码。
for(int i=0;i<20;i++)
{
        sleep(1);
}
否则的话,在20秒内,Qt的主循环就不进行了。所以,在你的程序运行的前20秒里,按钮是得不到响应的。
离线frog
只看该作者 3楼 发表于: 2011-04-12
建议你使用void timerEvent( QTimerEvent * event ),使用int timerId;timerId = timerStart(1000);启用定时器,定时的时间间隔为1秒。
离线frog
只看该作者 4楼 发表于: 2011-04-12
res = double(tmp/10);应该改为(double)tmp / 10;
离线caffee_1989
只看该作者 5楼 发表于: 2011-04-12
回 4楼(frog) 的帖子
非常感谢啊,听了您的意见终于改好了,再次谢谢。不过按您说的改了之后,第一个问题也解决了,请问知道是什么原因不?
离线caffee_1989
只看该作者 6楼 发表于: 2011-04-13
应该是sleep的问题。
快速回复
限100 字节
 
上一个 下一个