Linux驅動開發實戰(五):Qt應用程序點RGB燈(保姆級快速入門!)
文章目錄
- Linux驅動開發實戰(五):Qt應用程序點RGB燈(保姆級快速入門!)
- 前言
- 實驗環境
- 實驗原理
- C語言應用轉到QT應用
- 實驗步驟
- 1. 創建Qt項目
- 2. 設計用戶界面
- 3. 實現MainWindow類
- mainwindow.h
- mainwindow.cpp
- 編譯與調試過程
- 先在PC端運行
- 構建可執行程序
- 移植QT應用
- 運行QT應用
- 總結
前言
在上一篇文章中設備樹點RGB燈,我們介紹了如何通過設備樹驅動來控制RGB LED,并使用簡單的echo命令向設備文件寫入字符來操作LED。本文將進一步探討如何通過Qt圖形界面應用程序來實現同樣的功能,為用戶提供一個直觀、友好的操作界面。
實驗環境
- 開發板:野火開發板Imx6ull pro
- 系統:嵌入式Linux
- 開發工具:Qt5
- 編程語言:C++
實驗原理
本實驗的核心原理與前一篇文章相同,即通過向/dev/rgb_led
設備文件寫入不同的值來控制RGB LED的不同顏色:
- 寫入’1’:點亮紅色LED
- 寫入’2’:點亮綠色LED
- 寫入’4’:點亮藍色LED
- 寫入’0’:關閉所有LED
不同之處在于,這次我們使用Qt框架開發了一個圖形界面應用,通過按鈕點擊事件來觸發這些操作,而不是直接在命令行中使用echo命令。
C語言應用轉到QT應用
下面是C語言編寫的程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {printf("Program started\n");// 循環執行命令while (1) {// 執行第一個命令: echo '1' > /dev/rgb_ledprintf("Executing command 1\n");int ret = system("sudo sh -c \"echo '1' > /dev/rgb_led\"");if (ret == -1) {perror("Error executing command 1");return 1;}printf("Command 1 executed successfully\n");sleep(1); // 等待1秒// 執行第二個命令: echo '2' > /dev/rgb_ledprintf("Executing command 2\n");ret = system("sudo sh -c \"echo '2' > /dev/rgb_led\"");if (ret == -1) {perror("Error executing command 2");return 1;}printf("Command 2 executed successfully\n");sleep(1); // 等待1秒// 執行第三個命令: echo '4' > /dev/rgb_ledprintf("Executing command 3\n");ret = system("sudo sh -c \"echo '4' > /dev/rgb_led\"");if (ret == -1) {perror("Error executing command 3");return 1;}printf("Command 3 executed successfully\n");sleep(1); // 等待1秒}return 0;
}
直接使用交叉編譯器編譯:
arm-linux-gnueabihf-gcc RGB.c -o RGB
在開發板上輸入命令
sudo ./RGB
即可執行
RGB燈在開發板上就會每隔一秒換一個顏色亮起
那QT程序應該怎么寫呢?
實驗步驟
1. 創建Qt項目
首先,我們使用Qt Creator創建一個新的Qt Widgets Application項目,命名為RGB。
2. 設計用戶界面
在Qt Designer中,我們設計了一個簡單的界面,包含三個按鈕,分別用于控制紅、綠、藍三種顏色的LED。
每個按鍵右擊選擇轉到槽即可創建事件點擊函數
3. 實現MainWindow類
mainwindow.h
首先,我們需要在頭文件中聲明我們的類和方法:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();void on_pushButton_3_clicked();private:Ui::MainWindow *ui;bool executeCommand(const QString &cmd); // Add this line
};#endif // MAINWINDOW_H
mainwindow.cpp
然后,在實現文件中編寫具體功能:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QProcess>
#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);// 設置按鈕標簽和樣式ui->pushButton->setText("紅色LED");ui->pushButton->setStyleSheet("background-color: #ff8080; min-height: 60px; font-size: 14px;");ui->pushButton_2->setText("綠色LED");ui->pushButton_2->setStyleSheet("background-color: #80ff80; min-height: 60px; font-size: 14px;");ui->pushButton_3->setText("藍色LED");ui->pushButton_3->setStyleSheet("background-color: #8080ff; min-height: 60px; font-size: 14px;");
}MainWindow::~MainWindow()
{// 應用關閉時關閉LEDexecuteCommand("echo '0' > /dev/rgb_led");delete ui;
}bool MainWindow::executeCommand(const QString &cmd)
{QProcess process;QString fullCommand = "sudo sh -c \"" + cmd + "\"";qDebug() << "執行命令: " << fullCommand;process.start("bash", QStringList() << "-c" << fullCommand);process.waitForFinished();int exitCode = process.exitCode();if (exitCode != 0) {qDebug() << "命令執行失敗,退出碼: " << exitCode;qDebug() << "錯誤信息: " << process.readAllStandardError();return false;}return true;
}void MainWindow::on_pushButton_clicked()
{// 控制紅色LEDif (executeCommand("echo '1' > /dev/rgb_led")) {qDebug() << "紅色LED已點亮";}
}void MainWindow::on_pushButton_2_clicked()
{// 控制綠色LEDif (executeCommand("echo '2' > /dev/rgb_led")) {qDebug() << "綠色LED已點亮";}
}void MainWindow::on_pushButton_3_clicked()
{// 控制藍色LEDif (executeCommand("echo '4' > /dev/rgb_led")) {qDebug() << "藍色LED已點亮";}
}
編譯與調試過程
先在PC端運行
如果沒問題的話即可利用交叉編譯編譯成可執行程序
構建可執行程序
然后點擊錘子
構建
在編譯過程中,我曾遇到了一個錯誤:
/home/embedfire/qtdemo/RGB/mainwindow.cpp:29: error: use of undeclared identifier 'executeCommand'
這個錯誤是由于在mainwindow.h文件中沒有聲明executeCommand函數而導致的。解決方法是在mainwindow.h的MainWindow類中添加私有方法聲明:
private:bool executeCommand(const QString &cmd);
修復后,項目成功編譯并運行。
移植QT應用
構建好的應用在這里
開發板輸入命令
sudo mount -t nfs 192.168.247.118:/home/embedfire/workdir /mnt
把它通過nfs傳到開發板
sudo cp RGB /usr/local/qt-app/RGB
放到qt-app目錄下
運行QT應用
加載驅動
驅動在上一章節已經寫好了
設備樹點RGB燈
sudo insmod dts_led.ko
運行命令
sudo /usr/local/qt-app/run_myapp.sh /usr/local/qt-app/RGB
成功點燈
總結
本文介紹了如何使用Qt框架開發一個RGB LED控制應用,實現了通過圖形界面控制硬件設備的功能。相比于命令行操作,圖形界面應用提供了更好的用戶體驗和更豐富的功能可能性。