【北京迅为】《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程序到开发板即可。

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值