相關(guān)推薦
您可能對(duì)下面課程感興趣
Arduino視頻教程基礎(chǔ)篇

75小節(jié)已有138544人學(xué)過

Arduino教程——編寫Arduino類庫(kù)(2)
發(fā)布時(shí)間:2022-03-11 09:55 [ 我要自學(xué)網(wǎng)原創(chuàng) ] 發(fā)布人: 小劉2175 閱讀: 5909
編寫頭文件與源文件
通常,一個(gè)類庫(kù)中包含兩種后綴的文件:.h文件,和.cpp文件。
.h文件稱作頭文件,其用于聲明類庫(kù)及其成員;.cpp文件稱作源文件,其用于定義類庫(kù)及其成員。

編寫頭文件

首先我們需要建立一個(gè)SR04.h的頭文件,在SR04.h這個(gè)文件中我們要聲明一個(gè)SR04超聲波類。

類的聲明方法如下:
[mw_shl_code=cpp,true]
class SR04 {
public:
private:
};[/mw_shl_code]通常一個(gè)類可以包含兩個(gè)部分——public和private。public中聲明的函數(shù)和變量可以被外部程序所訪問,而private中聲明的函數(shù)和變量,只能從這個(gè)類的內(nèi)部訪問。

接著,根據(jù)我們的實(shí)際需求來設(shè)計(jì)這個(gè)類,SR04類的結(jié)構(gòu)如圖4-4所示。
4-4 SR04類結(jié)構(gòu)圖

它包含兩個(gè)成員函數(shù)和三個(gè)成員變量。

SR04() 函數(shù)是一個(gè)與類同名的構(gòu)造函數(shù),用于初始化對(duì)象。我們需要在public中聲明這個(gè)函數(shù)。聲明如下:
[mw_shl_code=cpp,true]
SR04(int TrigPin,int EchoPin);[/mw_shl_code]
這個(gè)構(gòu)造函數(shù)用來替代之前我們使用的void init_SR04(int TrigPin,int EchoPin) 函數(shù)。需要注意的是構(gòu)造函數(shù)必須與類同名,且不能有返回類型。


我們還需要一個(gè)GetDistance函數(shù)來獲取并處理超聲波傳感器返回的信息
[mw_shl_code=cpp,true]
float GetDistance();[/mw_shl_code]
這個(gè)函數(shù)用來替代我們之前使用的 float GetDistance (int TrigPin,int EchoPin) 函數(shù)

還有一些程序運(yùn)行過程中的函數(shù)或變量,用戶在使用時(shí)并不會(huì)接觸到他們,我們可以將其放在private部分中聲明:
[mw_shl_code=cpp,true]
// 記錄SR04使用的引腳
int Trig_pin;
int Echo_pin;
// 記錄SR04返回的距離
float distance;[/mw_shl_code]

完整的SR04.h代碼如下:
[mw_shl_code=cpp,true]
#ifndef SR04_H
#define SR04_H
#include "Arduino.h"
class SR04 {
public:
        SR04(int TrigPin,int EchoPin);
        float GetDistance();
private:
        int Trig_pin;
        int Echo_pin;
        float distance;
};
#endif[/mw_shl_code]



預(yù)處理命令


以“#”開頭的語句,為預(yù)處理命令。之前我們包含文件使用的#include,及常量定義時(shí)使用的#define均為預(yù)處理命令。
預(yù)處理命令并不是C/C++語言的組成部分,編譯器不會(huì)直接對(duì)其進(jìn)行編譯,而是在編譯前,系統(tǒng)會(huì)預(yù)先處理這些命令。

宏定義
如你的程序中用#define COL 1112 定義了一個(gè)名為COL的常量,實(shí)際在編譯前,系統(tǒng)會(huì)將你代碼中所有的COL替換為1112,再對(duì)替換后的代碼進(jìn)行編譯。
這種定義方式稱之為宏定義。即使用一個(gè)特定的標(biāo)識(shí)符來代表一個(gè)字符串。其一般形式為:
[mw_shl_code=cpp,true]
#define 標(biāo)識(shí)符字符串[/mw_shl_code]
在Arduino中,我們常用到HIGH、LOW、INPUT、OUTPUT等參數(shù)、及圓周率PI等常量都是通過宏的方式定義的。

文件包含
若程序中使用#include包含了一個(gè)文件,例如#include <EEPROM.h>,在預(yù)處理時(shí)系統(tǒng)會(huì)將該命令替換成EEPROM.h文件中的實(shí)際內(nèi)容,再對(duì)替換后的代碼進(jìn)行編譯。
文件包含命令的一般形式為:
[mw_shl_code=cpp,true]
#include<文件名>[/mw_shl_code]
[mw_shl_code=cpp,true]
#include“文件名”[/mw_shl_code]
兩種形式的實(shí)際效果是一樣的,只是使用<文件名>形式時(shí),系統(tǒng)會(huì)優(yōu)先在Arduino庫(kù)文件中尋找目標(biāo)文件,若沒有找到,系統(tǒng)會(huì)再到當(dāng)前Arduino項(xiàng)目的項(xiàng)目文件夾中查找;而使用“文件名”形式時(shí),系統(tǒng)會(huì)優(yōu)先在你的Arduino項(xiàng)目文件中查找目標(biāo)文件,若沒有找到,再查找Arduino庫(kù)文件。

條件編譯
回到SR04.h,在其中,你會(huì)看到以下代碼:
[mw_shl_code=cpp,true]
#ifndef SR04_H
#define SR04_H
.
.
.
#endif[/mw_shl_code]
其中
[mw_shl_code=cpp,true]
#ifndef標(biāo)識(shí)符
程序段
#endif[/mw_shl_code]
為條件編譯命令。#ifndef SR04_H會(huì)查找標(biāo)識(shí)符SR04_H是否在程序的其他位置被#define定義過。若沒有被定義過,則定義該標(biāo)識(shí)符。這個(gè)寫法主要為了防止重復(fù)的包含某文件,避免程序編譯出錯(cuò)。




編寫源文件


接著,我們還要建立一個(gè)SR04.cpp源文件。在SR04.cpp文件中,我們需要寫出了頭文件中聲明的成員函數(shù)的具體實(shí)現(xiàn)代碼。


完整代碼如下:

[mw_shl_code=cpp,true]
#include "Arduino.h"
#include "SR04.h"
SR04::SR04(int TP, int EP)
{
   pinMode(TP,OUTPUT);
   pinMode(EP,INPUT);
   Trig_pin=TP;
   Echo_pin=EP;
}
float SR04::GetDistance()
{
        digitalWrite(Trig_pin, LOW);
        delayMicroseconds(2);
        digitalWrite(Trig_pin, HIGH);
        delayMicroseconds(10);
        digitalWrite(Trig_pin, LOW);
        float distance = pulseIn(Echo_pin, HIGH) / 58.00;
        return distance;
}[/mw_shl_code]

域操作符
我們?cè)赟R04.h文件中聲明了SR04類及其成員,在SR04.cpp中定義該函數(shù)的實(shí)現(xiàn)方法。在類聲明以外定義成員函數(shù)時(shí),需要使用域操作符::,說明該函數(shù)作用于SR04類。
Arduino視頻教程基礎(chǔ)篇
我要自學(xué)網(wǎng)商城 ¥40 元
進(jìn)入購(gòu)買
文章評(píng)論
0 條評(píng)論 按熱度排序 按時(shí)間排序 /350
添加表情
遵守中華人民共和國(guó)的各項(xiàng)道德法規(guī),
承擔(dān)因您的行為而導(dǎo)致的法律責(zé)任,
本站有權(quán)保留或刪除有爭(zhēng)議評(píng)論。
參與本評(píng)論即表明您已經(jīng)閱讀并接受
上述條款。
V
特惠充值
聯(lián)系客服
APP下載
官方微信
返回頂部
相關(guān)推薦
您可能對(duì)下面課程感興趣
Arduino視頻教程基礎(chǔ)篇

75小節(jié)已有138544人學(xué)過

分類選擇:
電腦辦公 平面設(shè)計(jì) 室內(nèi)設(shè)計(jì) 室外設(shè)計(jì) 機(jī)械設(shè)計(jì) 工業(yè)自動(dòng)化 影視動(dòng)畫 程序開發(fā) 網(wǎng)頁設(shè)計(jì) 會(huì)計(jì)課程 興趣成長(zhǎng) AIGC