QT控制硬件
- 1.上位機程序開發
- 2.具體例子控制led燈
- 3. linux中的函數跟QT類里面的函數同名,發生沖突
- 4.示例代碼
1.上位機程序開發
QT做一個上位機程序,控制底層的硬件設備(下位機)
總結:
- 在構造函數里面去初始化,打開硬件驅動
- 在析構函數里面去關閉硬件驅動
2.具體例子控制led燈
第一步:下載編譯好的led驅動并安裝驅動insmod led_drv.ko //安裝命令,一次性的永久安裝: 打開開發板的 /etc/profile,把剛才的安裝命令寫在最后面保存
第二步:新建一個QT程序,開燈,關燈的邏輯需要查看led驅動的源代碼是如何編寫的,如buf[0]-->led的狀態:0--led off, 1--led onbuf[1]-->哪一盞燈:8~11.
3. linux中的函數跟QT類里面的函數同名,發生沖突
由于QMainWindow中有一個同名的 bool QWidget::close()
此時調用linux版本的close,QT默認優先使用自己的close,所以報錯
如果程序員一定要使用linux版本的close,需要在close的前面加上::(告訴QT的編譯器,這個close是外部函數,不是本類的成員函數)
::close(ledfd);
4.示例代碼
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::MainWindow *ui;int ledfd; //led對應的文件描述符
};
#endif // MAINWINDOW_H// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//構造函數里面打開led的驅動ledfd=open("/dev/led_drv",O_RDWR);if(ledfd==-1){perror("打開led失敗了!\n");return;}
}MainWindow::~MainWindow()
{//析構函數里面關閉led的驅動//QT默認把這個close當成了本類自己的close//close(ledfd);//現在要使用close是linux中的那個close::close(ledfd); //::告訴QT的編譯器,close不是本類的成員函數,是個外部函數delete ui;
}//開燈對應的槽函數
void MainWindow::on_pushButton_clicked()
{char buf[2]={0};buf[0]=1; //燈的狀態,亮buf[1]=8; //燈的序號,控制8號燈write(ledfd,buf,2); //把控制命令發送給led的驅動
}
//關燈對應的槽函數
void MainWindow::on_pushButton_2_clicked()
{char buf[2]={0};buf[0]=0; //燈的狀態,滅buf[1]=8; //燈的序號,控制8號燈write(ledfd,buf,2); //把控制命令發送給led的驅動
}