今天将前几天的工作做了一个汇总,学了几天QT应用,然后尝试用QT来点亮龙芯2k0300蜂鸟板板载的LED灯,以及同步显示该引脚的数字电压值(为将来显示温度/湿度值做准备)。
一. 准备工作
1.我这种操作的前提是修改了对应内核的设备树中关于LED的代码。
2.对LED灯的操作,可以参考我前面的帖子[https://bbs.elecfans.com/jishu_2447791_1_1.html]([2K系列] # 【龙芯2K0300蜂鸟板试用】第四篇 龙芯2K0300蜂鸟板--继续点灯)
二. QT工程
对QT的学习,我个人的理解就是一个界面的美观设计和理解槽/信号的概念。
具体工程由以下3个文件组成。
1.mainwindows.h 主要是LED对应引脚、2个控件(button和lable)、3个内部函数的声明。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include <QFile>
#include <QLabel>
**#define LED_GPIO_INDEX "85"**
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:** QPushButton *pushButton;
QLabel *label;
int led_init(void);
void setLedState();**
private slots:
** void pushButtonClicked();**
};
#endif
- main.cpp 主要是界面的显示实现
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
- mainwindow.cpp 这个文件是工程的核心部分,功能就是每次点击一下button,便会点亮/关闭板载的LED灯,同时在另一边会显示LED灯引脚的数字电压值。这里我的界面布置有问题,懒得调整了。
#include "mainwindow.h"
#include <QDebug>
#include <QGuiApplication>
#include <QScreen>
#include <QRect>
#include <QMessageBox>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
int ret;
QList <QScreen *> list_screen = QGuiApplication::screens();
this->resize(800, 480);
pushButton = new QPushButton(this);
label= new QLabel(this);
pushButton->setMinimumSize(200, 50);
pushButton->setGeometry((this->width() - pushButton->width()) /3 ,
(this->height() - pushButton->height()) /3,
pushButton->width(),
pushButton->height()
);
label->setMinimumSize(200, 50);
label->setGeometry((this->width() - pushButton->width()) *2/3 ,
(this->height() - pushButton->height()) *2/3,
pushButton->width(),
pushButton->height()
);
ret = led_init();
if (ret == 1 || ret == 2)
pushButton->setText("未获取到LED设备!");
connect(pushButton, SIGNAL(clicked()),
this, SLOT(pushButtonClicked()));
}
MainWindow::~MainWindow()
{
int fd;
fd = open("/sys/class/gpio/unexport", O_WRONLY);
if(fd < 0)
pushButton->setText("关闭LED设备失败!");
write(fd, LED_GPIO_INDEX, strlen(LED_GPIO_INDEX));
::close(fd);
pushButton->setText("LED设备关闭成功。");
}
int MainWindow::led_init()
{
int fd;
fd = open("/sys/class/gpio/export", O_WRONLY);
if(fd < 0)
return 1 ;
write(fd, LED_GPIO_INDEX, strlen(LED_GPIO_INDEX));
fd = open("/sys/class/gpio/gpio" LED_GPIO_INDEX "/direction", O_WRONLY);
write(fd, "out", strlen("out"));
fd = open("/sys/class/gpio/gpio" LED_GPIO_INDEX "/value", O_WRONLY);
write(fd, "1", 1);
::close(fd);
}
void MainWindow::setLedState()
{
int fd, ret;
static int value = 0;
fd = open("/sys/class/gpio/gpio" LED_GPIO_INDEX "/direction", O_WRONLY);
write(fd, "in", strlen("in"));
fd = open("/sys/class/gpio/gpio" LED_GPIO_INDEX "/value", O_WRONLY);
ret = read(fd, &value, sizeof(value));
label->setText(QString::number(value));
fd = open("/sys/class/gpio/gpio" LED_GPIO_INDEX "/direction", O_WRONLY);
write(fd, "out", strlen("out"));
fd = open("/sys/class/gpio/gpio" LED_GPIO_INDEX "/value", O_WRONLY);
if (!value)
{
write(fd, "0", 1);
pushButton->setText("LED点亮");
value = 1;
}
else
{
write(fd, "1", 1);
pushButton->setText("LED熄灭");
value = 0;
}
::close(fd);
}
void MainWindow::pushButtonClicked()
{
setLedState();
}
- 厂商已经提前在虚拟机中将QT的龙芯交叉编译环境配置好了,所以直接部署工程就行了,操作如图1所示。
图1 部署工程
三. 执行QT工程
将生成的QT文件拷入龙芯2k0300蜂鸟板中,执行操作如图2所示,执行效果如下视频所示。
图2 操作命令