QT控制硬件(控制开发板上led灯)
=====================================
1.目的
体会QT开发上位机程序,控制硬件传感器的思路
一般我们在主界面的构造函数中初始化硬件(打开驱动)
在析构函数中关闭硬件(关闭驱动)2.步骤
led灯总共四盏,控制逻辑
8 9 10 11分别是灯的序号
1 --》灯亮
0 --》灯灭
char buf[2];
buf[0] --》灯亮/灭
buf[1] --》灯的序号
(1)安装led灯的驱动
把我的驱动led_drv.ko文件下载到开发板的根目录,然后安装
安装命令: insmod led_drv.ko // /etc/profile最后面写上这句话,永久生效
驱动文件的路径:/dev/led_drv
(2)写代码控制led灯
open("/dev/led_drv");
write(驱动发送控制指令);3.linux/C语言中的函数跟QT中某个类的成员同名--》有冲突
解决方法:
::close(fd); //::告诉QT的编译器,close是个外部函数,不是本类的成员函数
close(fd); //QT的编译器会当成是本类成员函数
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//在构造函数中打开led的驱动
fd=open("/dev/led_drv",O_RDWR);
if(fd==-1)
{
printf("打开led失败!\n");
return;
}
//最开始让四盏灯全部熄灭
char buf[2];
for(int i=0; i<4; i++)
{
buf[0]=0; //灯灭
buf[1]=8+i; //灯的序号
write(fd,buf,2);
}
}
MainWindow::~MainWindow()
{
//关闭led的驱动
::close(fd); //::告诉QT的编译器,close是个外部函数,不是本类的成员函数
delete ui;
}
//开灯对应的槽函数
void MainWindow::on_openbt_clicked()
{
//四盏灯全部亮
char buf[2];
for(int i=0; i<4; i++)
{
buf[0]=1; //灯亮
buf[1]=8+i; //灯的序号
write(fd,buf,2);
}
}
//关灯对应的槽函数
void MainWindow::on_closebt_clicked()
{
//四盏灯全部灭
char buf[2];
for(int i=0; i<4; i++)
{
buf[0]=0; //灯灭
buf[1]=8+i; //灯的序号
write(fd,buf,2);
}
}
流水灯
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
n=0;
//在构造函数中打开led的驱动
fd=open("/dev/led_drv",O_RDWR);
if(fd==-1)
{
printf("打开led失败!\n");
return;
}
//最开始让四盏灯全部熄灭
char buf[2];
for(int i=0; i<4; i++)
{
buf[0]=0; //灯灭
buf[1]=8+i; //灯的序号
write(fd,buf,2);
}
//设置定时器时间
mytimer.setInterval(1000);
//关联timeout信号
connect(&mytimer,SIGNAL(timeout()),this,SLOT(fun()));
}
MainWindow::~MainWindow()
{
//关闭led的驱动
::close(fd); //::告诉QT的编译器,close是个外部函数,不是本类的成员函数
delete ui;
}
//开启流水灯
void MainWindow::on_openbt_clicked()
{
mytimer.start();
}
//关闭流水灯
void MainWindow::on_closebt_clicked()
{
mytimer.stop();
}
//超时对应的槽函数
void MainWindow::fun()
{
//四盏灯全部灭
char buf[2];
for(int i=0; i<4; i++)
{
buf[0]=0; //灯灭
buf[1]=8+i; //灯的序号
write(fd,buf,2);
}
//每次点亮其中一盏灯
buf[0]=1; //灯亮
buf[1]=8+n; //灯的序号
write(fd,buf,2);
//控制n的变化范围
if(n<3)
n++;
else
n=0;
}