【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第六篇 嵌入式GUI开发篇-第八十五章 Qt控制硬件

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT、4G模块、CAN、RS485等接口一应俱全。H264、VP8视频硬编码,H.264、H.265、VP8、VP9视频硬解码,并提供相关历程,支持8路PDM接口、5路SAI接口、2路Speaker。系统支持Android9.0(支持获取root限)Linux4.14.78+Qt5.10.1、Yocto、Ubuntu20、Debian9系统。适用于智能充电桩,物联网,工业控制,医疗,智能交通等,可用于任何通用工业和物联网应用、

【公众号】迅为电子

【粉丝群】258811263(加群获取驱动文档+例程)


第八十五章 Qt控制硬件

本章内容对应视频讲解链接(在线观看):

QT跨平台运行之使用QT控制蜂鸣器  QT跨平台运行之使用QT控制蜂鸣器_哔哩哔哩_bilibili

注意!!!视频教程是以IMXULL终结者开发板进行讲解的,以此为参考,我们也可以控制IMX8MM开发板上的硬件。但是IMX8MM开发板上没有蜂鸣器和多余的led灯,所以我们这个章节要领会其精神,以此为参考。

我们在QT上要怎么操作驱动呢?比如,我们要点亮一个led灯,我们在C语言中可以使用open,read,write,ioctl函数来进行操作,但是QT上我们使用的语言是C++,那我们要怎么来操作驱动呢?

我们可以使用C和C++进行混合编程,我们先来看一个控制蜂鸣器的APP代码,代码如下:

#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"#define BEEPOFF 0
#define BEEPON 1/** @description : main 主程序* @param - argc : argv 数组元素个数* @param - argv : 具体参数* @return : 0 成功;其他 失败*/
int main(int argc, char *argv[])
{int fd, retvalue;char *filename;unsigned char databuf[1];if(argc != 3){printf("Error Usage!\r\n");return -1;}filename = argv[1];/* 打开 beep 驱动 */fd = open(filename, O_RDWR);if(fd < 0){printf("file %s open failed!\r\n", argv[1]);return -1;}databuf[0] = atoi(argv[2]); /* 要执行的操作:打开或关闭 *//* 向/dev/beep 文件写入数据 */retvalue = write(fd, databuf, sizeof(databuf));if(retvalue < 0){printf("BEEP Control Failed!\r\n");close(fd);return -1;}retvalue = close(fd); /* 关闭文件 */if(retvalue < 0){printf("file %s close failed!\r\n", argv[1]);return -1;}return 0;
}

通过上面的代码我们可以发现,使用C语言来控制一个蜂鸣器,无非就是打开设备节点,然后通过write来写入数据就可以控制蜂鸣器了。既然我们可以使用C和C++混合编程,那么我们是不是只需要把这个C控制蜂鸣器的代码直接加到QT程序里面就可以了,那我们要怎么进行混合编程呢?

我们先新建一个QT工程,然后添加两个按钮来控制蜂鸣器的打开和关闭,UI界面如

然后我们开始移植代码,因为C++是面向对象的,C是面向过程的,所以在QT上,我们要用面向对象的思想来进行编程,所以我们第一步,就是要先创建一个类,把C语音控制蜂鸣器的代码封装成一个类。

我们右键选中这个工程,然后选择添加新文件,添加C++ Class如下图

 

后我们添加类的名字,因为我们操作的是蜂鸣器,所以我们这里写成Beep,如 

 

第一步,我们把C语言控制蜂鸣器代码的头文件,添加到我们刚才添加Beep类生成的文件beep.h里面,但是头文件我们不能直接复制过去,我们要用extern C{}括起来,代码如下: 

extern "C"{#include "stdio.h"#include "unistd.h"#include "sys/types.h"#include "sys/stat.h"#include "fcntl.h"#include "stdlib.h"#include "string.h"
}

 添加完成如所示:

第二步,把我们C语言控制蜂鸣器里面的参数定义复制到public下面,代码如下:

int fd, retvalue;

char *filename;

unsigned char databuf[1];

添加完如所示:

 

然后我们打开beep.cpp,把C语言控制蜂鸣器里面的打开设备节点的代码复制到构造函数里面,注意,QT里面我们不能使用printf,代码如下:

/* 打开 beep 驱动 */

    fd = open(filename, O_RDWR);

    if(fd < 0){

        return ;

    }

 添加完如所示:

注意:蜂鸣器的设备节点不要错,大家要依据自己节点的实际情况来写

然后我们创建一个打开蜂鸣器和一个关闭蜂鸣器的函数,第一步,现在beep.h里面声明,然后在beep.cpp里面实现。

声明:

代码如下:

 void Beep_On();void Beep_Off();

添加完如所示:

实现:

代码如下,注意c语言函数前面要加::,表示这个函数是C函数。

void Beep::Beep_On()
{/* 向/dev/beep 文件写入数据 */databuf[0] = 1;retvalue = ::write(fd, databuf, sizeof(databuf));if(retvalue < 0){::close(fd);return ;}
}void Beep::Beep_Off()
{databuf[0] = 0;retvalue = ::write(fd, databuf, sizeof(databuf));if(retvalue < 0){::close(fd);return ;}
}

 添加完如所示

添加好了之后,我们直接使用这个类就可以了,注意,我们这里使用的是write,所以我们的驱动也是要支持write才可以,IMX8MM底板上没有蜂鸣器,所以默认源码里面是没有蜂鸣器驱动的,这个QT例程只是作为一个QT控制开发板上硬件(蜂鸣器)的例子,如果大家想要控制底板上的某些外设,可以参考本章节

我们先在widget里面新建一个beep,然后我们在构造函数里面新建一个对象,如所示:

 

然后我们在槽函数里面执行对应的打开和关闭动作即可,如所示:

修改完以后,我们按照上一小节的方法,交叉编译QT程序到开发板即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/52377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

青龙面板本地部署流程结合内网穿透使用手机远程本地服务器薅羊毛

文章目录 前言一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用。本教程使用Docker部署青龙&#xff0c;如何安装Docker详见&#xff1a; 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 …

案例分享—优秀ui设计作品赏析

多浏览国外优秀UI设计作品&#xff0c;深入分析其设计元素、色彩搭配、布局结构和交互方式&#xff0c;以理解其背后的设计理念和趋势。 在理解的基础上&#xff0c;尝试将国外设计风格中的精髓融入自己的设计中&#xff0c;同时结合国内用户的审美和使用习惯&#xff0c;进行创…

Datawhale AI 夏令营 第五期 CV Task1

活动简介 活动链接&#xff1a;Datawhale AI 夏令营&#xff08;第五期&#xff09; 以及CV里面的本次任务说明&#xff1a;Task 1 从零上手CV竞赛 链接里的教程非常详细&#xff0c;很适合小白上手&#xff0c;从报名赛事到使用服务器平台再到跑模型&#xff0c;手把手教&…

今日(2024 年 8 月 26 日)科技新闻

鸿蒙智行问界新 M7 Pro 正式发布&#xff1a;今日&#xff0c;鸿蒙智行举行首次新品发布会&#xff0c;问界新 M7 Pro 正式上市&#xff0c;官方售价 24.98 万 - 28.98 万元&#xff0c;同时&#xff0c;鸿蒙智行首款轿跑 SUV 智界 R7 正式亮相。AITO 问界 2 年 5 个月交付 40 …

JavaScript按位与操作详解:原理、应用与注意事项

在JavaScript中&#xff0c;按位与&#xff08;bitwise AND&#xff09;是一种二进制操作&#xff0c;它对两个数的二进制表示进行逐位比较。只有当两个相应的二进制位都为1时&#xff0c;结果位才为1&#xff0c;否则为0。这种操作在处理图像、进行权限控制或执行某些特定的数…

easyExcel 填充写时,动态合并单元格

1、定义合并单元格策略获取方法 /** * description: 获取第二个表格的合并策略* param secondTablelist * return: java.util.List<com.alibaba.excel.write.merge.OnceAbsoluteMergeStrategy> * author 30864* date: 2024/8/24 20:27*/ public static List<OnceAbs…

柔版印刷版市场前景:预计2030年全球市场规模将达到20.9亿美元

一、当前市场状况 目前&#xff0c;柔版印刷版市场呈现出较为稳定的发展态势。随着全球经济的逐步复苏&#xff0c;包装印刷等领域对柔版印刷版的需求持续增长。柔版印刷版具有环保、高效、印刷质量高等特点&#xff0c;在食品包装、标签印刷等行业中得到广泛应用。 全球前四…

FlinkCEP - Flink的复杂事件处理详解

目录 Pattern API 单独模式&#xff08;Individual Patterns&#xff09; 量词&#xff08;Quantifiers&#xff09; 条件&#xff08;Conditions&#xff09; 迭代条件 简单条件 组合条件 停止条件 组合模式&#xff08;Combining Patterns&#xff09; 模式组&…

网上商城|基于SprinBoot+vue的分布式架构网上商城系统(源码+数据库+文档)

分布式架构网上商城系统 目录 基于SprinBootvue的分布式架构网上商城系统 一、前言 二、系统设计 三、系统功能设计 5.1系统功能模块 5.2管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍…

微信小程序flex-grow无效

在微信小程序中使用 Flexbox 布局时&#xff0c;如果遇到 flex-grow 属性无效的情况&#xff0c;可能是由几个不同的原因导致的。以下是一些可能的原因和解决方案&#xff1a; 1. 检查 Flex 容器 确保你的父元素&#xff08;即 Flex 容器&#xff09;已经正确设置了 display:…

每期一个小窍门 golang中 CGO_ENABLED 含义

转载 CGO_ENABLED是一个环境变量&#xff0c;用于控制Go编译器是否启用CGO&#xff08;C语言调用Go函数&#xff09;功能。当CGO_ENABLED0时&#xff0c;表示禁用CGO功能。 编译时使用CGO_ENABLED0会导致编译速度较慢的原因有以下几点&#xff1a; 编译器需要额外的时间来检…

时间继电器和定时器

一、概述 1.时间继电器是可以在设定的定时周期内或周期后闭合或断开触点的元器件。 2.时间继电器上可设定的定时周期数量有限&#xff0c;多为一个或两个。定时时长从0.02s至300h(根据产品型号范围不同)。 3.定时器可以理解为一台钟表&#xff0c;它在某个时间点上闭合(断开…

PostgreSQL11 | 事务处理与并发控制

PostgreSQL11 | 事务处理与并发控制 本文章代码已在pgsql11.22版本上运行且通过&#xff0c;展示页由pgAdmin8.4版本提供&#xff0c;本文章第一次采用md文档&#xff0c;效果比csdn官方富文本编辑器好用&#xff0c;以后的文章都将采用md文档 事务管理简介 事物是pgsql中的…

三种相机模型总结(针孔、鱼眼、全景)

相机标定 文章目录 相机标定前言 前言 我们最常见的投影模型Perspective Projection Model描述的就是针孔相机的成像原理。从上面的图根据相似三角形可以得出 参考链接 https://zhuanlan.zhihu.com/p/540969207 相机标定之张正友标定法数学原理详解&#xff08;含python源码&a…

上线eleme项目

&#xff08;一&#xff09;搭建主从从数据库 主服务器master 首先下载mysql57安装包&#xff0c;然后解压 复制改目录到/usr/local底下并且改个名字 cp -r mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql 删掉/etc/my.cnf 这个会影响mysql57的启动 rm -rf /etc…

解读vue3源码-响应式篇3 effect副作用函数

提示&#xff1a;看到我 请让我滚去学习 文章目录 前言effect问题拓展分支切换与 cleanup嵌套的 effect 与 effect 栈解决在副作用函数中同时读取和操作同一属性时无限循环 effect函数实现computed-api 实现图解在这里插入图片描述 总结 前言 什么是副作用函数&#xff1f; 在…

SCYC 56901传感器SCYC 56901模块面价

SCYC 56901传感器SCYC 56901模块面价 SCYC 56901传感器SCYC 56901模块面价 SCYC 56901传感器SCYC 56901模块面价 SCYC 56901传感器SCYC 56901模块引脚线 SCYC 56901传感器SCYC 56901模块说明书 SCYC 56901传感器SCYC 56901模块电路图 SCYC 56901温度传感器是早开发&#…

iPhone 手机使用技巧:iPhone 数据恢复软件

无论是由于意外删除、系统崩溃还是软件更新&#xff0c;丢失 iPhone 上的数据都是一场噩梦。从珍贵的照片到重要的工作文件&#xff0c;这种损失可能会让人感到毁灭性。值得庆幸的是&#xff0c;几个 iPhone 数据恢复软件选项可以帮助您找回丢失的文件。这些工具提供不同的功能…

神经网络——非线性激活

1 非线性激活 1.1 几种常见的非线性激活&#xff1a; ReLU (Rectified Linear Unit)线性整流函数 Sigmoid 1.2代码实战&#xff1a; 1.2.1 ReLU import torch from torch import nn from torch.nn import ReLUinputtorch.tensor([[1,-0.5],[-1,3]])inputtorch.reshape(…

刷题DAY18

排序 题目&#xff1a;输入10个大小不同的整数&#xff0c;将它们从小到大排序后输出&#xff0c;并给出现每个元素在原来序列中的位置 输入&#xff1a;输入数据有一行&#xff0c;包含10个整数&#xff0c;用空格分开 输出&#xff1a;输出数据有两行&#xff0c;第一行为…