Chinaunix首页 | 论坛 | 博客
  • 博客访问: 408563
  • 博文数量: 62
  • 博客积分: 1483
  • 博客等级: 上尉
  • 技术积分: 779
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-24 12:25
文章分类

全部博文(62)

文章存档

2012年(2)

2011年(6)

2010年(6)

2009年(48)

我的朋友

分类: LINUX

2009-11-22 19:33:26

adc读数qt代码,开始以为需要qt的多线程方法,后来看到了了
QTimer这个类,呵呵,他也可以实现
一边控制主窗口,一边读外部文件的不确定的数据(ad采集)

hello.h----------------------------
#include
#include
#include
#include
#include
#include
#include
#include

class myMainWindow : public QWidget
{
    Q_OBJECT
    public:
        myMainWindow();
    public slots:
        void getAd();
        void bEvent(); //按钮事件
    private:
        int fd;
        bool flag;
        QPushButton *b_on1;
        QLabel *label;
        QTimer *readAdc;
        QLCDNumber *lcdnum;
};

hello.cpp---------------------------
#include "hello.h"

myMainWindow::myMainWindow()
{
    setMinimumSize(200,200);
    setMaximumSize(200,200);

    flag = 0; //初始化成0,表示未启动ad转换

    label = new QLabel(this);
    label->setMinimumSize(150,60);
    label->setMaximumSize(240,30);
    label->setFont(QFont("Times",15,QFont::Black));
    label->setText("press the button to\n"
                    "get ad data");
    label->setAlignment(AlignCenter);

    b_on1 = new QPushButton("start",this);
    b_on1->setMinimumSize(50,20);
    b_on1->setFont(QFont("Times",15,QFont::Bold));


    lcdnum = new QLCDNumber(this);
    lcdnum->setSegmentStyle(QLCDNumber::Filled);
    lcdnum->display(0);

    QVBoxLayout *vbox = new QVBoxLayout(this);

    vbox->addWidget(label);
    vbox->addWidget(lcdnum);
    vbox->addWidget(b_on1);

    connect(b_on1,SIGNAL(clicked()),this,SLOT(bEvent()));

    readAdc = new QTimer(this); //使用q版定时器,问题就解决了。
    connect(readAdc,SIGNAL(timeout()),this,SLOT(getAd()));
    readAdc->stop(); //先不开启,等按钮被按下才开始

//    setWindowTitle("ad convert"); //这个东东在qte2.2.0版本里没有
}

#include
#include
#include
#include
#include
#include
#include


#define CMD_ADC_START_AND_GET     1
#define CMD_SEL_MUX   2

void myMainWindow::getAd() //这个槽要根据flag的值来判断启动adc与否
{
    int val = 0;

    if(flag){
        readAdc->stop();
        fd = open("/dev/myadc", 0);
        if (fd < 0) {
            perror("open device adc");
            exit(1);
        }
        ioctl(fd, CMD_SEL_MUX, 0); //选择通道0
        val = ioctl(fd,CMD_ADC_START_AND_GET);
        ::close(fd);
        lcdnum->display(val);
        readAdc->start(100);
    }else{
        readAdc->stop(); //停止qtimer
        lcdnum->display(0); //显示成0
    }
}

void myMainWindow::bEvent()
{
    flag = (flag?false:true); //改变标志
    if(flag){ //这里表示开始adc
        b_on1->setText(QString("stop"));
        readAdc->start(100); //激活定时器
    }else{ //这里是关闭adc
        b_on1->setText(QString("start"));
    }
}

int main(int argc,char **argv)
{
    QApplication a(argc,argv);
    myMainWindow w;
    a.setMainWidget(&w);
    w.show();
    a.exec();
}
-------------------------------
按下start按钮开始读ad数据,按钮变成stop字样,再按停止读ad数据
阅读(2039) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~