分类: qt入门/开发
adc读数qt代码,开始以为需要qt的多线程方法,后来看到了了
QTimer这个类,呵呵,他也可以实现
一边控制主窗口,一边读外部文件的不确定的数据(ad采集)
hello.h----------------------------
#include <qapplication.h>
#include <qwidget.h>
#include <qpushbutton.h>
#include <qfont.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qtimer.h>
#include <qlcdnumber.h>
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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#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数据