QT5.14.2下操作硬件之LED

0.总结

无论采用哪种方式都要把led相关操作封装成一个类,用面向对象的思想
1.新建工程->application->qt widgets application
2.拖两个button分别表示打开,关闭,控件改名
3.右键led工程名字下添加)>新建->c++ class
4.命名为Led,基类选择qobject
5.最后目录如下
在这里插入图片描述

1.方式1

主要是把原来访问驱动的APP拿过来,混合c/c++编程。

led.h代码如下
#ifndef LED_H
#define LED_H

#include <QObject>
//为了可以调用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"
}
#define LED_ON 1
#define LED_OFF 0

class Led : public QObject
{
    Q_OBJECT
public:
    explicit Led(QObject *parent = nullptr);
//自己添加的begin
    int fd, retvalue;
    const char *filename;//文件名也没用上,写死
    unsigned char databuf[1];//传递的参数,没用上

    void led_on();
    void led_off();
//自己添加的end
signals:

};

#endif // LED_H

led.cpp代码如下
#include "led.h"

Led::Led(QObject *parent) : QObject(parent)
{
    fd = open("/dev/beep", O_RDWR);
    if(fd < 0){
        return ;
    }
}

void Led:: led_on()
{
    databuf[0]=1;
    retvalue=::write(fd,databuf,sizeof(databuf));
    if(retvalue < 0){
        ::close(fd);//迅为教程说C语言函数前面要加这个::,表示这个函数是c函数,也可以不加
        return ;
    }
}

void Led:: led_off()
{
    databuf[0] = 0;
    retvalue = ::write(fd, databuf, sizeof(databuf));
    if(retvalue < 0){
        ::close(fd);
        return ;
    }
}
widget.h代码如下
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "led.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
    Led *led;//定义一个led对象
};
#endif // WIDGET_H
widget.cpp代码如下
#include "widget.h"
#include "ui_widget.h"
#include "led.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    led=new Led(this);//new对象
    //led->filename="C:\\Users\\Administrator\\Desktop\\test.txt";
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_clicked()//槽函数
{
    led->led_on();
}

void Widget::on_pushButton_2_clicked()
{
    led->led_off();
}

2.方式2

#ifndef LED_H
#define LED_H

#include <QObject>

#include <QDebug>
#include <QString>
#include <QByteArray>
#include <QFile>

#define LED_ON      0x01
#define LED_OFF     0x00

#define LED1_BRIGHTNESS    "/dev/led"


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

    int initLed(void);
    int readLed(void);
    int wrtieLed(int on_off);

signals:

};

#endif // LED_H

#include "led.h"
#include <QString>
#include <QFile>
led::led(QObject *parent) : QObject(parent)
{

}


int led::initLed(void)
{
    QFile led1_file(LED1_BRIGHTNESS);
    if(!led1_file.open(QIODevice::ReadWrite))
    {
        return -1;
    }

    led1_file.close();
    return 0;//成功
}

int led::readLed(void)
{
    int ret;
    QFile led1_file(LED1_BRIGHTNESS);
    if(!led1_file.open(QIODevice::ReadWrite))
    {
        return -1;
    }

    QString str=led1_file.readAll();
    ret=(str.toInt()!=0)?1:0;
    led1_file.close();
    return ret;

}

int led::wrtieLed(int on_off)
{
    QFile led1_file(LED1_BRIGHTNESS);
    if(!led1_file.open(QIODevice::ReadWrite))
    {
        return -1;
    }
    QTextStream out(&led1_file);
    out<<on_off;
    led1_file.close();
    return  0;
}

#include "widget.h"
#include "ui_widget.h"
#include "led.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    led1=new led();

    if(led1->initLed()==0)
    {
        int led_on_off=led1->readLed();
        if(led_on_off==1)
        {

        }
    }
    else //初始化失败,表示文件不存在,设置按钮不可用
    {
        ui->pushButton->setEnabled(false);
        ui->pushButton_2->setEnabled(false);
    }
}

Widget::~Widget()
{
    delete ui;
}

3.完善

led类的构造函数,析构函数,以及析构顺序

4.指定按键为回车

ui->pushButton->setShortcut(tr("Return"));
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值