Qt控制开发板硬件

目录

一、C语言控制硬件

二、给Qt工程添加头文件

三、UI界面设计

四、功能代码实现 


一、C语言控制硬件

        我们在 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工程添加头文件

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

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

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

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

#ifndef BEEP_H
#define BEEP_H

#include <QObject>

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"
}


class beep : public QObject
{
    Q_OBJECT
public:
    explicit beep(QObject *parent = nullptr);

signals:

public slots:
};

#endif // BEEP_H

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

#ifndef BEEP_H
#define BEEP_H

#include <QObject>

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"
}


class beep : public QObject
{
    Q_OBJECT
public:
    explicit beep(QObject *parent = nullptr);

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

signals:

public slots:
};

#endif // BEEP_H

然后我们打开 beep.cpp, 把 C 语言控制蜂鸣器里面的打开设备节点的代码复制到构造函数里面。

#include "beep.h"

beep::beep(QObject *parent) : QObject(parent)
{
    fd = open(filename, O_RDWR);
    if(fd < 0){
        return ;
    }
}

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

#ifndef BEEP_H
#define BEEP_H

#include <QObject>

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"
}


class beep : public QObject
{
    Q_OBJECT
public:
    explicit beep(QObject *parent = nullptr);

    int fd, retvalue;
    char *filename;
    unsigned char databuf[1];
    
    void Beep_On();
    void Beep_Off();

signals:

public slots:
};

#endif // BEEP_H
#include "beep.h"

beep::beep(QObject *parent) : QObject(parent)
{
    fd = open(filename, O_RDWR);
    if(fd < 0){
        return ;
    }
}

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,然后我们在构造函数里面新建一个对象。

Beep = new beep(this);

三、UI界面设计

四、功能代码实现 

void Widget::on_open_clicked()
{
    Beep->Beep_On();
}

void Widget::on_close_clicked()
{
    Beep->Beep_Off();
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琪琪猫不会嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值