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控制应用,实现了通过图形界面控制硬件设备的功能。相比于命令行操作,图形界面应用提供了更好的用户体验和更丰富的功能可能性。
相关文章:
Linux驱动开发实战(五):Qt应用程序点RGB灯(保姆级快速入门!)
Linux驱动开发实战(五):Qt应用程序点RGB灯(保姆级快速入门!) 文章目录 Linux驱动开发实战(五):Qt应用程序点RGB灯(保姆级快速入门!)前…...
前端登录鉴权全解析:主流方案对比与实现指南
文章目录 一、常见登录鉴权方式概览1.1 主流方案对比1.2 技术特性对比 二、Session/Cookie方案2.1 实现原理2.2 代码实现2.3 优缺点分析 三、JWT方案3.1 实现原理3.2 代码实现3.3 优缺点分析 四、OAuth方案4.1 实现原理4.2 代码实现4.3 优缺点分析 五、SSO方案5.1 实现原理5.2 …...
【C++】每日一练(链表的中间结点)
本篇博客给大家带来的是用C语言来解答找中间结点! 🐟🐟文章专栏:每日一练 🚀🚀若有问题评论区下讨论,我会及时回答 ❤❤欢迎大家点赞、收藏、分享! 今日思想:不服输的…...
『大模型笔记』什么是MCP?将AI智能体与数据库和API集成
什么是MCP?将AI智能体与数据库和API集成 文章目录 MCP 由多个组件组成,最重要的有以下三个:MCP 体系结构MCP 的实际应用示例为什么要关注 MCP?官方MCP架构图总结如果你正在构建 AI 智能体,可能听说过 MCP(Model Context Protocol,模型上下文协议)。MCP 是一个开源标准…...
使用Redis如何实现分布式锁?(超卖)
分布式锁概念 在多线程环境下,为了保证数据的线程安全,锁保证同一时刻,只有一个可以访问和更新共享数据。在单机系统我们可以使用 synchronized 锁、Lock 锁保证线程安全。 synchronized 锁是 Java 提供的一种内置锁,在单个 JVM …...
【雅思播客07】I‘m in debt.负债
Hey guys! Welcome to my channel, I’m Mavis. Good morning! 欢迎来到我的频道,我是Mavis老师,早上好呀! Today we’re gonna learn a dialogue about recession, a period of temporary economic decline during which trade and indu…...
实现悬浮按钮拖动,兼容h5和微信小程序
h5用js写,微信小程序用 代码里面没有完全实现吸附边缘的功能,需要吸附边缘的话还得自己再完善下(h5的吸附边缘是可以的,小程序的还有点问题) 主要功能是:图片上写文字的悬浮按钮,文字使用的是…...
JavaScript 模块 vs C# 类:封装逻辑的两种哲学
引言 在现代软件开发中,模块化和面向对象设计是代码组织的核心课题。本文通过对比 JavaScript 模块(ES6 Module)与 C# 类(Class)的实现方式,探讨两种语言在封装逻辑时的不同哲学,并给出实际应用…...
Java面向对象编程进阶:深入理解static、单例模式与继承
在面向对象编程(OOP)中,掌握高级特性是提升代码质量和设计能力的关键。本文基于Java语言,深入探讨static关键字、单例设计模式、继承等核心概念,并结合实际应用场景与深度思考,帮助读者构建系统化的知识体系…...
【6】拓扑排序学习笔记
前言 有向无环图和拓扑排序直接关联到中后期的图论建模思想,是很重要的基础知识。这个如果不彻底弄懂,以后图论会很困难。 有向无环图 正如其名,一个边有向,没有环的图,也叫DAG。 DAG图实际运用:描述含…...
珠算之加减法中出现负数情况
在珠算加减法过程中出现负数情况的处理 如果数字 A 小于 B,要求计算 A-B,此时出现了小数减大数的情况,其结果应该是负数。 在平时,计算 A-B 时,如果发现 A 小于 B,则计算时只要计算 B-A,结果记…...
使用Python在Word中生成多种不同类型的图表
目录 工具与环境配置 在 Word 中创建图表的步骤 在Word中创建柱形图 在Word中创建条形图 在Word中创建折线图 在Word中创建饼图 在Word中创建散点图 在Word中创建气泡图 在 Word 文档中插入图表不仅能更直观地呈现数据,还能提升文档的可读性和专业性。常见的…...
pycharm + anaconda + yolo11(ultralytics) 的视频流实时检测,保存推流简单实现
目录 背景pycharm安装配置代码实现创建本地视频配置 和 推流配置视频帧的处理和检测框绘制主要流程遇到的一些问题 背景 首先这个基于完整安装配置了anaconda和yolo11的环境,如果需要配置开始的话,先看下专栏里另一个文章。 这次的目的是实现拉取视频流…...
Netty基础—5.Netty的使用简介
大纲 1.Netty服务端的启动流程 2.服务端IO事件的处理类 3.Netty客户端的启动流程 4.客户端IO事件的处理类 5.启动Netty服务端和客户端的方法说明 6.Netty服务端和客户端使用总结 7.什么是TCP粘包拆包 8.TCP粘包拆包的几种情况 9.TCP粘包拆包的原因 10.粘包问题的解决…...
C++初阶——类和对象(一)
C初阶——类和对象(一) 一、面向过程和面向对象 1.面向过程 面向过程的程序设计(Procedure-Oriented Programming),简称POP,是一种是以程序执行流程为核心的编程范式。它是先分析出解决问题所需要的的步…...
1141. 【贪心算法】排队打水
题目描述 有n(n<1000)个人在一个水龙头前排队接水,假如每个人接水的时间为Ti, 请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。输入 输入文件共两行,第一行为n; 第二行分别…...
RabbitMQ入门:从安装到高级消息模式
文章目录 一. RabbitMQ概述1.1 同步/异步1.1.1 同步调用1.1.2 异步调用 1.2 消息中间件1.2.1 概念1.2.2 作用1.2.3 常见的消息中间件1.2.4 其他中间件 1.3 RabbitMQ1.3.1 简介1.3.2 特点1.3.3 方式1.3.4 架构1.3.5 运行流程 二. 安装2.1 Docker 安装 RabbitMQ 三. 简单队列&…...
Linux应用:进程的回收
进程的诞生和消亡 程的诞生通常是通过系统调用(如fork、exec等)来创建新进程。当一个进程完成其任务或者出现错误时,它会进入消亡阶段。进程可以通过exit函数主动结束自身,也可能由于操作系统的调度策略(如资源耗尽、…...
如何利用 AI 技术快速定位和修复生产环境问题
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
Linux find 命令完全指南
find 是 Linux 系统最强大的文件搜索工具,支持 嵌套遍历、条件筛选、执行动作。以下通过场景分类解析核心用法,涵盖高效搜索、文件管理及高级技巧: 一、基础搜索模式 1. 按文件名搜索(精确/模糊匹配) <BASH> f…...
市场波动中的风险管理与策略优化
市场波动中的风险管理与策略优化 在市场交易中,价格的波动性为投资者提供了交易机会,但同时也带来了风险。如何在市场不确定性中进行有效的风险管理,并优化交易策略,是每位交易者都需要思考的问题。本文将探讨市场波动的影响因素、…...
(链表)206. 反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示例 3: 输入&am…...
Jetson Orin NX jupyter lab的安装和使用
主要是为了梳理一下整个过程,其实步骤很简单,但容易出错。 注意,实际只有两个文件需要写入,一个是jupyter_lab_config.py,一个是jupyter.service。 配置文件的名字要写对,如果总是copy网上的代码࿰…...
前端npm包- CropperJS
文章目录 一、CropperJS**核心特性****官网与文档****安装与使用**1. **通过 npm/yarn/pnpm 安装**2. **HTML 结构**3. **引入 CSS 和 JS**4. **初始化裁剪器** **相关插件/替代方案****适用场景****注意事项** 总结 一、CropperJS cropperjs 是一个轻量级、功能强大的 图片裁…...
农业建设项目管理系统评测:8款推荐工具优缺点分析
本文主要介绍了以下8款农业建设项目管理系统:1.PingCode; 2. Worktile ;3. 建米农业工程项目管理系统;4. 开创云数字农业管理平台; 5. Trimble Ag Software;6.Conservis; 7. Agworld ࿱…...
linux 命令 tail
tail 是 Linux 中用于查看文件末尾内容的命令,常用于日志监控和大文件快速浏览。以下是其核心用法及常见选项: 基本语法 tail [选项] 文件名 常用选项 显示末尾行数 -n <行数> 或 --lines<行数> 指定显示文件的最后若干行(…...
测试开发 - 正浩创新 - 一面面经(已OC)
自我介绍 实习过程中,有遇到过什么问题,是如何解决的 实习成果中的数据指标变化,人力消耗一直在递减,是什么原因 实习工作有很多模块,那一块工作对你的提升或者收获是比较大的 讲一下,简历中所罗列的几…...
实验8 搜索技术
实验8 搜索技术 一、实验目的 (1)掌握搜索技术的相关理论,能根据实际情况选取合适的搜索方法; (2)进一步熟悉盲目搜索技术,掌握其在搜索过程中的优缺点; (3)…...
VSTO(C#)Excel开发9:处理格式和字体
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
LinkedList底层结构和源码分析(JDK1.8)
参考视频:韩顺平Java集合 特点 LinkedList 底层实现了 双向链表 和 双端队列 的特点。可以添加任意元素(元素可以重复),包括 null。线程不安全,没有实现同步。 LinkedList 底层结构 LinkedList 底层维护了一个双向链…...
