当前位置: 首页 > article >正文

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驱动开发实战&#xff08;五&#xff09;&#xff1a;Qt应用程序点RGB灯&#xff08;保姆级快速入门&#xff01;&#xff09; 文章目录 Linux驱动开发实战&#xff08;五&#xff09;&#xff1a;Qt应用程序点RGB灯&#xff08;保姆级快速入门&#xff01;&#xff09;前…...

前端登录鉴权全解析:主流方案对比与实现指南

文章目录 一、常见登录鉴权方式概览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语言来解答找中间结点&#xff01; &#x1f41f;&#x1f41f;文章专栏&#xff1a;每日一练 &#x1f680;&#x1f680;若有问题评论区下讨论&#xff0c;我会及时回答 ❤❤欢迎大家点赞、收藏、分享&#xff01; 今日思想&#xff1a;不服输的…...

『大模型笔记』什么是MCP?将AI智能体与数据库和API集成

什么是MCP?将AI智能体与数据库和API集成 文章目录 MCP 由多个组件组成,最重要的有以下三个:MCP 体系结构MCP 的实际应用示例为什么要关注 MCP?官方MCP架构图总结如果你正在构建 AI 智能体,可能听说过 MCP(Model Context Protocol,模型上下文协议)。MCP 是一个开源标准…...

使用Redis如何实现分布式锁?(超卖)

分布式锁概念 在多线程环境下&#xff0c;为了保证数据的线程安全&#xff0c;锁保证同一时刻&#xff0c;只有一个可以访问和更新共享数据。在单机系统我们可以使用 synchronized 锁、Lock 锁保证线程安全。 synchronized 锁是 Java 提供的一种内置锁&#xff0c;在单个 JVM …...

【雅思播客07】I‘m in debt.负债

Hey guys! Welcome to my channel, I’m Mavis. Good morning! 欢迎来到我的频道&#xff0c;我是Mavis老师&#xff0c;早上好呀&#xff01; Today we’re gonna learn a dialogue about recession, a period of temporary economic decline during which trade and indu…...

实现悬浮按钮拖动,兼容h5和微信小程序

h5用js写&#xff0c;微信小程序用 代码里面没有完全实现吸附边缘的功能&#xff0c;需要吸附边缘的话还得自己再完善下&#xff08;h5的吸附边缘是可以的&#xff0c;小程序的还有点问题&#xff09; 主要功能是&#xff1a;图片上写文字的悬浮按钮&#xff0c;文字使用的是…...

JavaScript 模块 vs C# 类:封装逻辑的两种哲学

引言 在现代软件开发中&#xff0c;模块化和面向对象设计是代码组织的核心课题。本文通过对比 JavaScript 模块&#xff08;ES6 Module&#xff09;与 C# 类&#xff08;Class&#xff09;的实现方式&#xff0c;探讨两种语言在封装逻辑时的不同哲学&#xff0c;并给出实际应用…...

Java面向对象编程进阶:深入理解static、单例模式与继承

在面向对象编程&#xff08;OOP&#xff09;中&#xff0c;掌握高级特性是提升代码质量和设计能力的关键。本文基于Java语言&#xff0c;深入探讨static关键字、单例设计模式、继承等核心概念&#xff0c;并结合实际应用场景与深度思考&#xff0c;帮助读者构建系统化的知识体系…...

【6】拓扑排序学习笔记

前言 有向无环图和拓扑排序直接关联到中后期的图论建模思想&#xff0c;是很重要的基础知识。这个如果不彻底弄懂&#xff0c;以后图论会很困难。 有向无环图 正如其名&#xff0c;一个边有向&#xff0c;没有环的图&#xff0c;也叫DAG。 DAG图实际运用&#xff1a;描述含…...

珠算之加减法中出现负数情况

在珠算加减法过程中出现负数情况的处理 如果数字 A 小于 B&#xff0c;要求计算 A-B&#xff0c;此时出现了小数减大数的情况&#xff0c;其结果应该是负数。 在平时&#xff0c;计算 A-B 时&#xff0c;如果发现 A 小于 B&#xff0c;则计算时只要计算 B-A&#xff0c;结果记…...

使用Python在Word中生成多种不同类型的图表

目录 工具与环境配置 在 Word 中创建图表的步骤 在Word中创建柱形图 在Word中创建条形图 在Word中创建折线图 在Word中创建饼图 在Word中创建散点图 在Word中创建气泡图 在 Word 文档中插入图表不仅能更直观地呈现数据&#xff0c;还能提升文档的可读性和专业性。常见的…...

pycharm + anaconda + yolo11(ultralytics) 的视频流实时检测,保存推流简单实现

目录 背景pycharm安装配置代码实现创建本地视频配置 和 推流配置视频帧的处理和检测框绘制主要流程遇到的一些问题 背景 首先这个基于完整安装配置了anaconda和yolo11的环境&#xff0c;如果需要配置开始的话&#xff0c;先看下专栏里另一个文章。 这次的目的是实现拉取视频流…...

Netty基础—5.Netty的使用简介

大纲 1.Netty服务端的启动流程 2.服务端IO事件的处理类 3.Netty客户端的启动流程 4.客户端IO事件的处理类 5.启动Netty服务端和客户端的方法说明 6.Netty服务端和客户端使用总结 7.什么是TCP粘包拆包 8.TCP粘包拆包的几种情况 9.TCP粘包拆包的原因 10.粘包问题的解决…...

C++初阶——类和对象(一)

C初阶——类和对象&#xff08;一&#xff09; 一、面向过程和面向对象 1.面向过程 面向过程的程序设计&#xff08;Procedure-Oriented Programming&#xff09;&#xff0c;简称POP&#xff0c;是一种是以程序执行流程为核心的编程范式。它是先分析出解决问题所需要的的步…...

1141. 【贪心算法】排队打水

题目描述 有n&#xff08;n<1000&#xff09;个人在一个水龙头前排队接水&#xff0c;假如每个人接水的时间为Ti&#xff0c; 请编程找出这n个人排队的一种顺序&#xff0c;使得n个人的平均等待时间最小。输入 输入文件共两行&#xff0c;第一行为n&#xff1b; 第二行分别…...

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应用:进程的回收

进程的诞生和消亡 程的诞生通常是通过系统调用&#xff08;如fork、exec等&#xff09;来创建新进程。当一个进程完成其任务或者出现错误时&#xff0c;它会进入消亡阶段。进程可以通过exit函数主动结束自身&#xff0c;也可能由于操作系统的调度策略&#xff08;如资源耗尽、…...

如何利用 AI 技术快速定位和修复生产环境问题

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

Linux find 命令完全指南

find 是 Linux 系统最强大的文件搜索工具&#xff0c;支持 嵌套遍历、条件筛选、执行动作。以下通过场景分类解析核心用法&#xff0c;涵盖高效搜索、文件管理及高级技巧&#xff1a; 一、基础搜索模式 1. 按文件名搜索&#xff08;精确/模糊匹配&#xff09; <BASH> f…...

市场波动中的风险管理与策略优化

市场波动中的风险管理与策略优化 在市场交易中&#xff0c;价格的波动性为投资者提供了交易机会&#xff0c;但同时也带来了风险。如何在市场不确定性中进行有效的风险管理&#xff0c;并优化交易策略&#xff0c;是每位交易者都需要思考的问题。本文将探讨市场波动的影响因素、…...

(链表)206. 反转链表

给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1a; 输入&am…...

Jetson Orin NX jupyter lab的安装和使用

主要是为了梳理一下整个过程&#xff0c;其实步骤很简单&#xff0c;但容易出错。 注意&#xff0c;实际只有两个文件需要写入&#xff0c;一个是jupyter_lab_config.py&#xff0c;一个是jupyter.service。 配置文件的名字要写对&#xff0c;如果总是copy网上的代码&#xff0…...

前端npm包- CropperJS

文章目录 一、CropperJS**核心特性****官网与文档****安装与使用**1. **通过 npm/yarn/pnpm 安装**2. **HTML 结构**3. **引入 CSS 和 JS**4. **初始化裁剪器** **相关插件/替代方案****适用场景****注意事项** 总结 一、CropperJS cropperjs 是一个轻量级、功能强大的 图片裁…...

农业建设项目管理系统评测:8款推荐工具优缺点分析

本文主要介绍了以下8款农业建设项目管理系统&#xff1a;1.PingCode&#xff1b; 2. Worktile &#xff1b;3. 建米农业工程项目管理系统&#xff1b;4. 开创云数字农业管理平台&#xff1b; 5. Trimble Ag Software&#xff1b;6.Conservis&#xff1b; 7. Agworld &#xff1…...

linux 命令 tail

tail 是 Linux 中用于查看文件末尾内容的命令&#xff0c;常用于日志监控和大文件快速浏览。以下是其核心用法及常见选项&#xff1a; 基本语法 tail [选项] 文件名 常用选项 显示末尾行数 -n <行数> 或 --lines<行数> 指定显示文件的最后若干行&#xff08;…...

测试开发 - 正浩创新 - 一面面经(已OC)

自我介绍 实习过程中&#xff0c;有遇到过什么问题&#xff0c;是如何解决的 实习成果中的数据指标变化&#xff0c;人力消耗一直在递减&#xff0c;是什么原因 实习工作有很多模块&#xff0c;那一块工作对你的提升或者收获是比较大的 讲一下&#xff0c;简历中所罗列的几…...

实验8 搜索技术

实验8 搜索技术 一、实验目的 &#xff08;1&#xff09;掌握搜索技术的相关理论&#xff0c;能根据实际情况选取合适的搜索方法&#xff1b; &#xff08;2&#xff09;进一步熟悉盲目搜索技术&#xff0c;掌握其在搜索过程中的优缺点&#xff1b; &#xff08;3&#xff09;…...

VSTO(C#)Excel开发9:处理格式和字体

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

LinkedList底层结构和源码分析(JDK1.8)

参考视频&#xff1a;韩顺平Java集合 特点 LinkedList 底层实现了 双向链表 和 双端队列 的特点。可以添加任意元素&#xff08;元素可以重复&#xff09;&#xff0c;包括 null。线程不安全&#xff0c;没有实现同步。 LinkedList 底层结构 LinkedList 底层维护了一个双向链…...