12_QT跨平台运行之使用QT控制蜂鸣器
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界面如下:
然后我们开始移植代码,因为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 ;
}
}
添加完如下图所示:
添加好了之后,我们直接使用这个类就可以了,我们先在widget里面新建一个beep,如下图所示:
然后我们在构造函数里面新建一个对象,如下图所示:
然后我们在槽函数里面执行对应的打开和关闭动作即可,如下图所示:
使用"insmod beep.ko"加载蜂鸣器驱动, 会出现"/dev/beep"节点
使用"./beep"运行程序