迅为4412开发板Qt下控制硬件
发布时间:2021-3-25 14:30
发布者:落风
我们在 QT 上要怎么操作驱动呢?比如,我们要点亮一个 led 灯,我们在 C 语言中可以使用 open,read,write,ioctl 函数来进行操作,但是 QT 上我们使用的语言是 C++,那我们要怎么来操作驱动呢? 我们可以使用 C 和 C++进行混合编程,我们先来看一个控制蜂鸣器的 APP 代码,这里以终结者 I.MX6ULL为例,iTOP-4412 可参考测例程代码,代码如下: #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 界面如图 62.4.1: ![]() 然后我们开始移植代码,因为 C++是面向对象的,C 是面向过程的,所以在 QT 上,我们要用面向对象的思想来进行编程,所以我们第一步,就是要先创建一个类,把 C 语音控制蜂鸣器的代码封装成一个类。 我们右键选中这个工程,然后选择添加新文件,添加 C++ Class 如图 62.4.2: ![]() 然后我们添加类的名字,因为我们操作的是蜂鸣器,所以我们这里写成 Beep,如图 62.4.3: ![]() 第一步,我们把 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" } 添加完成如图 62.4.4 所示: ![]() 图 62.4.4 第二步,把我们 C 语言控制蜂鸣器里面的参数定义复制到 public 下面,代码如下: int fd, retvalue; char *filename; unsigned char databuf[1]; 添加完如图 62.4.5 所示: ![]() 然后我们打开 beep.cpp,把 C 语言控制蜂鸣器里面的打开设备节点的代码复制到构造函数里面,注意,QT 里面我们不能使用 printf,代码如下: /* 打开 beep 驱动 */ fd = open(filename, O_RDWR); if(fd < 0){ return ; } 添加完如图 62.4.6 所示: ![]() 图 62.4.6 然后我们创建一个打开蜂鸣器和一个关闭蜂鸣器的函数,第一步,现在 beep.h 里面声明,然后在 beep.cpp 里面实现。 声明: 代码如下: void Beep_On(); void Beep_Off(); 添加完如图 62.4.7 所示: ![]() 图 62.4.7 实现: 代码如下,注意 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 ; } } 添加完如图 62.4.8 所示: ![]() 图 62.4.8 添加好了之后,我们直接使用这个类就可以了,我们先在 widget 里面新建一个 beep, 然后我们在构造函数里面新建一个对象,如图 62.4.9 所示: ![]() 图 62.4.9 然后我们在槽函数里面执行对应的打开和关闭动作即可,如图 62.4.10 所示: ![]() ![]() |
网友评论