Linux驱动开发实战(五):Qt应用程序点RGB灯(保姆级快速入门!)

ops/2025/3/16 5:23:23/

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.ppmy.cn/ops/166126.html

相关文章

ECharts仪表盘-仪表盘3,附视频讲解与代码下载

引言&#xff1a; ECharts仪表盘&#xff08;Gauge Chart&#xff09;是一种类似于速度表的数据可视化图表类型&#xff0c;用于展示单个或多个变量的指标和状态&#xff0c;特别适用于展示指标的实时变化和状态。本文将详细介绍如何使用ECharts库实现一个仪表盘&#xff0c;…

Spring Cloud Eureka - 高可用服务注册与发现解决方案

在微服务架构中&#xff0c;服务注册与发现是确保系统动态扩展和高效通信的关键。Eureka 作为 Spring Cloud 生态的核心组件&#xff0c;不仅提供去中心化的服务治理能力&#xff0c;还通过自我保护、健康检查等机制提升系统的稳定性&#xff0c;使其成为微服务架构中的重要支撑…

【ARM】MDK-not found in path ARMCC

1、 文档目标 解决 MDK 软件打开提示框&#xff1a;ARM Compiler Version not found in path:‘.\ARMCC’&#xff01; 2、 问题场景 打开keil工程时会警告 { *** Warning: Registered ARM Compiler Version not found n path&#xff1a;.\ARMCC! *** Update the configu…

Java使用JDBC连接操作Sqlite 笔记250314

Java使用JDBC连接操作Sqlite 以下是使用 Java JDBC 连接和操作 SQLite 数据库的详细步骤&#xff1a; 1. 添加 SQLite JDBC 驱动 在项目中引入 SQLite JDBC 驱动依赖。 Maven 项目在 pom.xml 中添加&#xff1a;<dependency><groupId>org.xerial</groupId>…

【flutter】flutter 环境搭建

flutter 简介 Flutter是谷歌的移动UI框架&#xff0c;可以快速在iOS和Android上构建高质量的原生用户界面。 具有跨平台开发特性&#xff0c;支持IOS、Android、Web三端。支持热重载特性&#xff0c;大大提高了开发效率。自绘UI引擎和编译成原生代码的方式&#xff0c;使得系…

spring boot+vue项目(免费)

医院管理系统项目地址&#xff1a; https://github.com/WangJingBo1234/hospital_manager 如果可以的话&#xff0c;麻烦大家在github上给我点个星&#xff0c;好人一生平安&#xff01;&#xff01;&#xff01; 该项目技术栈&#xff1a; 后端spring boot整合jwt&#xff0…

帮助和配置文件

帮助和配置文件 助手和配置文件是软件开发中的重要组成部分&#xff0c;它们有助于组织代码、管理设置以及简化重复性任务。 首先我们创建一个关于辅助的配置文件 例如我们的API URL&#xff0c;在程序中请求一般不止一次&#xff0c;而且如果URL有变动我们需要修改多个地方&…

【MySQL基础-2】使用 Docker 搭建 MySQL:配置文件详解与实战案例

在开发和部署 MySQL 数据库时&#xff0c;Docker 是一个非常流行的工具。它可以帮助我们快速创建和管理 MySQL 实例&#xff0c;同时通过配置文件&#xff08;如 my.cnf 或 my.ini&#xff09;对 MySQL 进行定制化设置。本文将详细介绍如何在 Docker 中配置 MySQL&#xff0c;并…