Linux驅動開發實戰(五):Qt應用程序點RGB燈(保姆級快速入門!)

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控制應用,實現了通過圖形界面控制硬件設備的功能。相比于命令行操作,圖形界面應用提供了更好的用戶體驗和更豐富的功能可能性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73422.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73422.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73422.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker安裝Kafka(內含zookeeper)

因為kafka是基于zookeeper做的&#xff0c;所以必須要有zookeeper 一、Zookeeper 1.拉取鏡像 docker pull zookeeper:3.7.02.運行 docker run --restartalways \--log-driver json-file \--log-opt max-size100m \--log-opt max-file2 \--name zookeeper -p 2181:2181 \-v…

芯谷D8563TS實時時鐘/日歷芯片詳解可替代PCF8563

概述 芯谷D8563TS是一款低功耗CMOS實時時鐘/日歷芯片&#xff0c;廣泛應用于移動電話、便攜式儀器、傳真機和電池供電產品等領域。該芯片通過兩線雙向IC總線進行數據傳輸&#xff0c;最大總線速度為400 kbits/s。D8563TS內置了自動遞增的字地址寄存器&#xff0c;支持多種功能…

【一次成功】Win10本地化單機部署k8s v1.31.2版本及可視化看板

【一次成功】Win10本地化單機部署k8s v1.31.2版本及可視化看板 零、安裝清單一、安裝Docker Desktop軟件1.1 安裝前<啟用或關閉Windows功能> 中的描紅的三項1.2 查看軟件版本1.3 配置Docker鏡像 二、更新裝Docker Desktop三、安裝 k8s3.1 點擊啟動安裝3.2 查看狀態3.3 查…

MoonSharp 文檔五

目錄 13.Coroutines&#xff08;協程&#xff09; Lua中的協程 從CLR代碼中的協程 從CLR代碼中的協程作為CLR迭代器 注意事項 搶占式協程 14.Hardwire descriptors&#xff08;硬編碼描述符&#xff09; 為什么需要“硬編碼” 什么是“硬編碼” 如何進行硬編碼 硬編…

【初級篇】如何使用DeepSeek和Dify構建高效的企業級智能客服系統

在當今數字化時代,企業面臨著日益增長的客戶服務需求。使用Dify創建智能客服不僅能夠提升客戶體驗,還能顯著提高企業的運營效率。關于DIfy的安裝部署,大家可以參考之前的文章: 【入門級篇】Dify安裝+DeepSeek模型配置保姆級教程_mindie dify deepseek-CSDN博客 AI智能客服…

【網絡編程】HTTP網絡編程

13.1 HTTP 簡介 HTTP(Hyper Text Transfer Protocol,超文本傳輸協議)是用于從萬維網(WWW:World Wide Web) 服務器(簡稱Web 服務器)傳輸超文本到本地瀏覽器的傳送協議&#xff0c;基于TCP/IP 通信協 議來傳遞數據 (HTML 文件、圖片文件、查詢結果等)。 13.2 HTTP 的工作原理 …

用Scrum敏捷的視角看《哪吒2》的創作

去年我們公司邀請Scrum中文網的老師培訓了敏捷開發課程&#xff0c;讓我對敏捷有了更深入的理解。前陣子我參加了scrum中文網的一個直播&#xff0c;老師分享了敏捷在個人領域或生活其他領域的應用&#xff0c;很有意思。因為我學習敏捷&#xff0c;除了應用到本身軟件研發的工…

Docker+Flask 實戰:打造高并發微服務架構

DockerFlask 實戰&#xff1a;打造高并發微服務架構 今天我們要深入探討一個非常熱門且實用的主題&#xff1a;基于 Docker 部署 Python Flask 應用。Docker 作為當下最流行的容器化技術&#xff0c;已經廣泛應用于各種開發和部署場景&#xff0c;尤其是在微服務架構中。而 Fl…

Linux find 命令完全指南

find 是 Linux 系統最強大的文件搜索工具&#xff0c;支持 嵌套遍歷、條件篩選、執行動作。以下通過場景分類解析核心用法&#xff0c;涵蓋高效搜索、文件管理及高級技巧&#xff1a; 一、基礎搜索模式 1. 按文件名搜索&#xff08;精確/模糊匹配&#xff09; <BASH> f…

【量化策略】趨勢跟蹤策略

【量化策略】趨勢跟蹤策略 &#x1f680;量化軟件開通 &#x1f680;量化實戰教程 技術背景與應用場景 在金融市場中&#xff0c;趨勢跟蹤策略是一種基于市場趨勢進行交易的量化投資方法。該策略的核心思想是“順勢而為”&#xff0c;即認為市場價格會沿著一定的方向持續移…

AI自動化、資本短視、三輸與破局

當前AI應用中的一個深層矛盾&#xff1a;工程師使用AI將很專業的任務變成小白可以操作的工作&#xff0c;然后資本方給小白很少的錢把工程師裁掉了&#xff0c;然而小白不懂底層&#xff0c;出問題幾乎無法修復。由此&#xff0c;技術普及與專業能力之間的斷層引發了"三輸…

Python數據分析之數據可視化

Python 數據分析重點知識點 本系列不同其他的知識點講解&#xff0c;力求通過例子讓新同學學習用法&#xff0c;幫助老同學快速回憶知識點 可視化系列&#xff1a; Python基礎數據分析工具數據處理與分析數據可視化機器學習基礎 四、數據可視化 圖表類型與選擇 根據數據特…

簡述計算機網絡中的七層模型和四層模型

在計算機網絡中&#xff0c;網絡協議棧的設計通常采用分層結構來處理不同的通信任務。常見的分層結構有OSI七層模型和TCP/IP四層模型。雖然它們的層次數量不同&#xff0c;但本質上都在解決如何有效地進行計算機間通信。本文將分別介紹這兩種結構的功能和各層的協議。 一、OSI七…

2025高頻面試算法總結篇【持續更新中】

文章目錄 遞歸&回溯131. 分割回文串面試題 08.12. 八皇后 動態規劃72編輯距離5. 最長回文子串279. 完全平方數300. 最長遞增子序列 遞歸&回溯 131. 分割回文串 回溯思路&#xff1a; 臨界條件&#xff1a; if (start s.length) > 保存 循環遍歷這個字串 for (int…

【大模型學習】第二十二章 什么是對抗生成網絡

目錄 一、背景介紹 二、生活化例子說明什么是對抗生成網絡 三、技術細節詳解 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;訓練機制 &#xff08;三&#xff09;損失函數 一、背景介紹 對抗生成網絡&#xff08;Generative Adversarial Networks, GANs…

攝像頭模塊ISP處理流程

攝像頭模塊的ISP&#xff08;圖像信號處理器&#xff09;處理流程是對圖像傳感器輸出的原始信號進行系統性優化的過程&#xff0c;主要分為以下關鍵步驟及對應功能模塊&#xff1a; 一、原始信號輸入與預處理 ?傳感器信號捕獲? CMOS/CCD傳感器將光信號轉換為模擬電信號&…

linux系統安裝和激活conda

安裝 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.shbash ./Miniconda3-latest-Linux-x86_64.sh回車到最后按照輸入yes&#xff0c;之后按提示操作。 激活 conda activate如果沒有反應或者返回&#xff1a; bash: conda: command not found則…

(全)2024下半年真題 系統架構設計師 綜合知識 答案解析02

系統架構設計師第二版教程VIP課程https://edu.csdn.net/course/detail/40283 面向對象技術 在UML用例圖中&#xff0c;參與者之間存在 關系。 A. 聚合 B. 包含 C. 繼承 D. 擴展 答案&#xff1a;C 解析&#xff1a;用例圖描述了一組用例、參與者以及它們之間的關系…

【學習筆記】《逆向工程核心原理》03.abex‘crackme-2、函數的調用約定、視頻講座-Tut.ReverseMe1

文章目錄 abexcrackme-21. Visual Basic文件的特征1.1. VB專用引擎1.2. 本地代碼與偽代碼1.3. 事件處理程序1.4. 未文檔化的結構體 2. 開始調試2.1. 間接調用2.2. RT_MainStruct結構體2.3. ThunRTMain()函數 3. 分析crackme3.1. 檢索字符串3.2. 查找字符串地址3.3. 生成Serial的…

深入解析Go語言Channel:源碼剖析與并發讀寫機制

文章目錄 Channel的內部結構Channel的創建過程有緩沖Channel的并發讀寫機制同時讀寫的可能性發送操作的實現接收操作的實現 并發讀寫的核心機制解析互斥鎖保護環形緩沖區等待隊列直接傳遞優化Goroutine調度 實例分析&#xff1a;有緩沖Channel的并發讀寫性能優化與最佳實踐緩沖…