我們在 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 所示: ![]() ![]() |