首页 > 其他分享 >12_QT跨平台运行之使用QT控制蜂鸣器

12_QT跨平台运行之使用QT控制蜂鸣器

时间:2024-04-17 17:27:04浏览次数:17  
标签:databuf 蜂鸣器 QT beep 跨平台 fd include

QT跨平台运行之使用QT控制蜂鸣器

QT****下操作硬件

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

我们可以使用C和C++进行混合编程,我们先来看一个控制蜂鸣器的APP代码,这里以终结者I.MX6ULL为例,代码如下:

#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界面如下:

img

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

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

img

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

img

第一步,我们把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"
}

添加完成如下图所示:

img

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

int fd, retvalue;
char *filename;
unsigned char databuf[1];

添加完如下图所示:

img

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

/* 打开 beep 驱动 */
fd = open(filename, O_RDWR);
if(fd < 0){
	return ;
}

添加完如下图所示:

img

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

声明:

代码如下:

void Beep_On();
void Beep_Off();

添加完如下图所示:

img

实现:

代码如下,注意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 ;
    }
}

添加完如下图所示:

img

添加好了之后,我们直接使用这个类就可以了,我们先在widget里面新建一个beep,如下图所示:

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

img

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

img

使用"insmod beep.ko"加载蜂鸣器驱动, 会出现"/dev/beep"节点

使用"./beep"运行程序

标签:databuf,蜂鸣器,QT,beep,跨平台,fd,include
From: https://www.cnblogs.com/mzx233/p/18141255

相关文章

  • 14_一键烧写QT程序到开发板
    一键烧写QT程序到开发板之前我们写好一个程序,都是先交叉编译完,然后在通过nfs/tftp或者其他的方法拷贝到开发板,然后在手动执行,如果我们调试程序很频繁,那我们每次都重新拷贝到开发板,那这样就太麻烦了,有没有方便一点的办法呢,这个就是接下来我们要介绍的一种方法,一键烧写QT程序到开发......
  • 07_QT时间编程之QT时钟
    QT时间编程之QT时钟这节课我们做一个计时器​ qtime:qt的时间类​ qtimer:qt的定时类代码widget.h#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>#include<QTime>#include<QTimer>namespaceUi{classWidget;}classWidget:publicQWidget{Q_OBJE......
  • 06_QT网络编程之UDP通信
    QT网络编程之UDP通信udp编程​ udp不分客户端和服务器,只需要使用一个类QUdpSocket。代码Udp.pro#-------------------------------------------------##ProjectcreatedbyQtCreator2024-04-13T23:07:41##-------------------------------------------------QT......
  • 11_QT跨平台运行之把QT程序交叉编译到ARM开发板
    QT跨平台运行之把QT程序交叉编译到ARM开发板交叉编译QT代码步骤一:给QT程序布局,然后在构造函数添加自动设置屏幕大小的代码。代码如下:#include<QDesktopWidget>#include<QStyle>#include<QRect>QDesktopWidget*deskTopWidget=QApplication::desktop();QRectdeskRec......
  • 10_QT系统移植之在开发板上部署QT运行环境
    QT系统移植之在开发板上部署QT运行环境一.开始部署1.我们在Ubuntu新创建一个文件夹,然后把我们用busybox做好的文件系统拷贝到这个文件下。如下图所示:2.然后我们解压这个根文件系统到当前所在的路径下。3.我们在这个解压出来的根文件系统下新创建一个opt的文件夹,如下图所示:......
  • 09_QT系统移植之交叉编译QT源码和触摸源码
    QT系统移植之交叉编译QT源码和触摸源码交叉编译QT源码一.源码下载​QT官网下载:http://download.qt.io/new_archive/qt/5.7/5.7.1/二.编译环境开发环境:Ubuntu16编译器:arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2三.编译触摸触摸源码在这个视频目录......
  • Python+Qt在苹果电脑生成app制作dmg
    生成setup.py文件,然后修改里面配置内容,如下所示:1#!python32#-*-coding:utf-8-*-3"""4Thisisasetup.pyscriptgeneratedbypy2applet56Usage:7pythonsetup.pypy2app8"""910fromsetuptoolsimportsetup,find_p......
  • Qt实现无边框窗口(二)
    本例使用纯Qt实现了无边框的窗口,包含了窗口外围的阴影和调整窗口大小的功能,以及最小化、最大化和关闭按钮的功能。本程序在VS2017、Qt5.9下测试通过。期间为了正确响应鼠标消息调试了1~2天,因为在推拽调整窗口大小的时候总是会出漏洞,不过最终还是解决了这些问题。运行效果如下图:......
  • pyqt5报错记录:ERROR: Failed building wheel for PyQt5-sip
    问题:pipinstallpyqt5Collectingpyqt5UsingcachedPyQt5-5.15.10-cp37-abi3-win_amd64.whl.metadata(2.2kB)CollectingPyQt5-sip<13,>=12.13(frompyqt5)UsingcachedPyQt5_sip-12.13.0.tar.gz(123kB)Installingbuilddependencies...doneGettingr......
  • Qt实现遮罩效果并可以拖动伸缩
    qml实现遮罩实现遮罩容易,但是如果可以任意拖动就需要动动脑子了,在经过大神的提示后,根据截图的界面思考,可以由五个矩形来实现(一个中心矩形和四个锚定在四周的矩形,它们一起充满程序窗口区域)QGraphicsView实现遮罩由于没有qml锚定布局,模拟锚定费时间,需要换一种思路,还是截图的灵感,......