第三個Qt開發實例:利用之前已經開發好的LED驅動在Qt生成的界面中控制LED2的亮和滅

前言

上一篇博文 https://blog.csdn.net/wenhao_ir/article/details/145459006 中,我們是直接利用GPIO子系統控制了LED2的亮和滅,這篇博文中我們利用之前寫好的LED驅動程序在Qt的生成的界面中控制LED2的亮和滅。

之前已經在下面兩篇博文中實現了LED驅動程序:
https://blog.csdn.net/wenhao_ir/article/details/144973219
https://blog.csdn.net/wenhao_ir/article/details/145119224
本篇博文中我們就在Qt的代碼中利用已經寫好的LED驅動程序來控制LED2的亮和滅。由于第2個LED驅動程序要去修改設備樹文件,比較麻煩,所以我們就用上面第1篇博文中的LED驅動程序來實現本篇博文“利用之前已經開發好的LED驅動在Qt生成的界面中控制LED2的亮和滅”的目的。

代碼來源及修改說明

本文的代碼在上一篇博文 https://blog.csdn.net/wenhao_ir/article/details/145459006 的基礎上進行修改,其實只需要改動文件led.cpp中的代碼,即把函數led_init和函數led_control按驅動程序的使用方法進行修改就行了。
由于之前是認真仔細地學習了驅動程序的書寫,所以其實代碼的修改是非常簡單的,所以相關的代碼就不去進行說明了。

完整源代碼

文件led.h中的代碼

#ifndef LED_H
#define LED_Hvoid led_init(void);
void led_control(int on);#endif // LED_H

文件mainwindow.h中的代碼

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_clicked();
private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

文件led.cpp中的代碼

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <QDebug>static int fd;void led_init(void)
{fd = open("/dev/imx6ull_led0", O_RDWR);if (fd < 0){qDebug()<<"open /dev/imx6ull_led0 failed";}
}void led_control(int on)
{char status;// 因為int類型是占4個字節,而我只向驅動空間寫入1個字節,正好char類型只占一個字節,所以這里要強制轉換一下// 當status為1時,驅動程序會在對應的GPIO口輸出低電平,此時燈亮,反之燈滅status = (char)on;write(fd, &status, 1);}

文件main.cpp中的代碼

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "led.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{static int status = 1;if (status)qDebug()<<"LED clicked on";elseqDebug()<<"LED clicked off";/* 2. control LED */led_control(status);status = !status;
}

文件mainwindow.cpp中的代碼

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "led.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{static int status = 1;if (status)qDebug()<<"LED clicked on";elseqDebug()<<"LED clicked off";/* 2. control LED */led_control(status);status = !status;
}

編譯工程生成可執行程序

為了確保是新生成的可執行程序,所以把之前在別的博文中生成的可執行程序刪掉~
在這里插入圖片描述
然后編譯:
在這里插入圖片描述
生成了新的ELF可執行文件:
在這里插入圖片描述
放到NFS網絡文件目錄中,備用:
在這里插入圖片描述

把驅動程序放到NFS目錄中備用

把博文 https://blog.csdn.net/wenhao_ir/article/details/144973219 中生成的驅動程序放到NFS目錄中備用
在這里插入圖片描述

上板測試

打開串口→啟動開發板

打開串口終端→打開開發板

關掉開發板上自帶的QT的GUI

經實測,如果不關閉開發板自帶的QT的GUI,雖然你自己寫的Qt界面能加載出來,但是當你用手劃動屏幕時,開發板上自帶的QT的GUI有可能會彈出來。

參考博文 https://blog.csdn.net/wenhao_ir/article/details/144591685 用一次性有效的方法(即不是永久有效的方法)關掉自帶的QT的GUI界面。

這里用一次性的方法,即不是永久有效的方法:
執行下面這條命令:

/etc/init.d/S99myirhmi2 stop

執行完成后再用手去操作屏幕上的UI界面,UI界面就沒有任何反應了,說明QT的GUI界面被關掉了

加載驅動程序

掛載網絡文件系統:

mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt

加載驅動程序

insmod /mnt/qt_driver_led/led_driver.ko

在這里插入圖片描述

設置Qt環境變量

export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
export QT_QPA_FONTDIR=/usr/lib/fonts/

這三條命令的詳細解釋見 https://blog.csdn.net/wenhao_ir/article/details/145433648

運行編譯生成的Qt程序

注意:運行前請確保Qt運行的環境變量設置好了。
注意:運行前請確保Qt運行的環境變量設置好了。

/mnt/qt_driver_led/test_01

在這里插入圖片描述
屏幕如下圖所示:
在這里插入圖片描述
點擊LED按鈕1次:
終端運行結果如下:
在這里插入圖片描述
此時LED2燈是亮著的。

再點LED按鈕1次:
終端運行結果如下:
在這里插入圖片描述
此是LED2燈滅了。

這樣測試就成功了。

附編譯完成后完整的工程目錄

https://pan.baidu.com/s/1sOm3uA8q_TLcuGqPCJ2I2g?pwd=gt5u
注意:QtCreator的工程換位置后一定要更換一下Build directory的位置,因為在QtCreator中Build directory是一個絕對路徑,詳情見 https://blog.csdn.net/wenhao_ir/article/details/145458743

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

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

相關文章

deepseek來講lua

Lua 是一種輕量級、高效、可嵌入的腳本語言&#xff0c;廣泛應用于游戲開發、嵌入式系統、Web 服務器等領域。以下是 Lua 的主要特點和一些基本概念&#xff1a; 1. 特點 輕量級&#xff1a;Lua 的核心非常小&#xff0c;適合嵌入到其他應用程序中。高效&#xff1a;Lua 的執…

(動態規劃 leetcode377)組合求和IV

確立狀態轉移方程需要深入理解問題&#xff0c;合理定義子問題&#xff0c;找到邊界條件(比如dp[0])&#xff0c;分析狀態之間的轉移關系&#xff08;dp和dp之間的關系&#xff09;&#xff0c;并進行驗證。 遞歸是自頂向下&#xff0c;而dp是自下而上 這里是i作為目標值&…

解決aspose將Excel轉成PDF中文變成方框的亂碼問題

原文網址&#xff1a;解決aspose將Excel轉成PDF中文變成方框的亂碼問題_IT利刃出鞘的博客-CSDN博客 簡介 本文介紹如何解決aspose將Excel轉成PDF中文變成方框的亂碼問題。 問題描述 用aspose將word、excel等轉成PDF后&#xff0c;英文展示正常&#xff0c;但中文全部變成了…

Netty 核心原理與高并發場景實踐

在當今的網絡編程領域&#xff0c;隨著互聯網應用的不斷發展&#xff0c;對高并發、高性能網絡通信的需求日益增長。Netty 作為一款基于 Java 的異步事件驅動的網絡應用框架&#xff0c;憑借其卓越的性能和豐富的功能&#xff0c;成為了實現高并發網絡應用的首選工具。無論是在…

問題大集04-瀏覽器阻止從 本地 發起的跨域請求,因為服務器的響應頭 Access-Control-Allow-Origin 設置為通配符 *

1、問題 localhost/:1 Access to XMLHttpRequest at xxx&#xff08;請求&#xff09; from origin http://localhost:xxx&#xff08;本地&#xff09; has been blocked by CORS policy: The value of the Access-Control-Allow-Origin header in the response must not be t…

判斷192.168.1.0/24網絡中,當前在線的ip有哪些

需求&#xff1a;判斷192.168.1.0/24網絡中&#xff0c;當前在線的ip有哪些&#xff0c;并編寫腳本打印出來。 [rootopenEuler ~]# cat 1.sh #!/bin/bash for ip in $(seq 1 254); do ping -c 1 -W 1 "192.168.1.$ip" > /dev/null 2>&1 if [ $? …

vue-vite axios bug

axios-bug http proxy error Error: write ECONNABORTED 代碼寫法 一般baseURL不是單寫前綴就可以了嗎&#xff0c;為何要寫死就不會出現以上錯誤&#xff0c;求解。

【Spring】_SpringBoot配置文件

目錄 1.Spring Boot配置文件 1.1 Spring Boot 的配置文件類型及命名 1.2 properties和yml的優先級 2. properties配置文件 1.1 properties語法格式 1.2 自定義配置及配置文件的讀取 1.3 properties的缺點 3. yml配置文件 3.1 yml語法格式 3.2 自定義配置及配置文件的…

實操給觸摸一體機接入大模型語音交互

本文以CSK6 大模型開發板串口觸摸屏為例&#xff0c;實操講解觸摸一體機怎樣快速增加大模型語音交互功能&#xff0c;使用戶能夠通過語音在一體機上查詢信息、獲取智能回答及實現更多互動功能等。 在本文方案中通過CSK6大模型語音開發板采集用戶語音&#xff0c;將語音數據傳輸…

深入解析 FFmpeg 的 AAC 編解碼過程

深入解析 FFmpeg 的 AAC 編解碼過程 —— 技術詳解與代碼實現 AAC(Advanced Audio Coding) 是一種高效的有損音頻壓縮格式,因其高壓縮效率和良好的音質而被廣泛應用于流媒體、廣播和音頻存儲等領域。FFmpeg 是一個強大的多媒體處理工具,支持 AAC 的編碼和解碼。本文將詳細…

RabbitMQ 從入門到精通:從工作模式到集群部署實戰(一)

#作者&#xff1a;閆乾苓 文章目錄 RabbitMQ簡介RabbitMQ與VMware的關系架構工作流程RabbitMQ 隊列工作模式及適用場景簡單隊列模式&#xff08;Simple Queue&#xff09;工作隊列模式&#xff08;Work Queue&#xff09;發布/訂閱模式&#xff08;Publish/Subscribe&#xff…

探索 Spring Cloud Alibaba:開啟微服務架構新時代

一、引言 在當今數字化浪潮中&#xff0c;軟件系統的規模和復雜度不斷攀升&#xff0c;傳統的單體架構逐漸難以滿足快速迭代、高并發處理以及靈活擴展的需求。微服務架構應運而生&#xff0c;它將一個大型的應用拆分成多個小型、自治的服務&#xff0c;每個服務專注于特定的業務…

Linux基礎命令之Nginx中的rewrite功能(重新)

一、什么是Rewrite Rewrite也稱URL Rewrite&#xff0c;即URL重寫&#xff0c;就是把傳入Web的請求重定向到其他URL的過程。 1. URL Rewrite最常見的應用是URL偽靜態化&#xff0c;是將動態頁面顯示為靜態頁面方式的一種技術。比如http://www.123.com/news/index.php?id123 使…

anaconda使用

anaconda配置鏡像源&#xff1a; 引用&#xff1a;https://zhuanlan.zhihu.com/p/17776864328 # 顯示所有的鏡像源 conda config --show channels # 設置鏡像源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add c…

DeepSeek 闡述 2025年前端發展趨勢

預測2025年前端的發展趨勢。首先&#xff0c;我需要考慮當前的前端 技術發展情況&#xff0c;以及近幾年的變化趨勢。比如&#xff0c;框架方面&#xff0c;React、Vue、Angular這些主流框架的更新方向和社區活躍度。可能用戶想知道未來哪些技術會更流行&#xff0c;或者需要學…

RK3568平臺開發系列講解(ConfigFS篇)ConfigFS核心數據結構

??返回專欄總目錄 文章目錄 一、數據結構二、結構體關系三、案例3.1、configfs_subsystem 實例3.2、config_group 實例化四、屬性和方法五、config_item實例化沉淀、分享、成長,讓自己和他人都能有所收獲!?? 理解 ConfigFS 的核心數據結構對于深入使用和定制 ConfigFS 非…

【實戰篇】巧用 DeepSeek,讓 Excel 數據處理更高效

一、為何選擇用 DeepSeek 處理 Excel 在日常工作與生活里,Excel 是我們頻繁使用的工具。不管是統計公司銷售數據、分析學生成績,還是梳理個人財務狀況,Excel 憑借其強大的功能,如數據排序、篩選和簡單公式計算,為我們提供了諸多便利。但當面對復雜的數據處理任務,比如從…

微信小程序案例1——制作貓眼電影底部標簽導航欄

文章目錄 一、項目步驟1 新建一個無AppID的movie項目2將準備好的底部標簽導航圖標拷貝到movie項目下面(將圖標文件夾image放到項目文件夾里&#xff09;3 打開App.json配置文件&#xff0c;在pages數組里添加4個頁面路徑:電影“pages/movie/movie”、影院“pages/cinema/cinema…

CSS 偽類(Pseudo-classes)的詳細介紹

CSS 偽類詳解與示例 在日常的前端開發中&#xff0c;CSS 偽類可以幫助我們非常精準地選擇元素或其特定狀態&#xff0c;從而達到豐富頁面表現的目的。本文將詳細介紹以下偽類的使用&#xff1a; 表單相關偽類 :checked、:disabled、:enabled、:in-range、:invalid、:optional、…

docker多個容器的相互通信

在同一臺宿主機上運行多個 Docker 容器時&#xff0c;容器之間可以通過以下幾種方式實現通信&#xff1a; 1. 使用 Docker 默認網絡&#xff08;Bridge 網絡&#xff09; Docker 默認會為每個容器分配一個 bridge 網絡&#xff0c;容器可以通過 IP 地址或容器名稱互相通信。 …