1. 程式人生 > >如何自己編寫Arduino支援的C++類庫

如何自己編寫Arduino支援的C++類庫

我們在上一講中實現了一個TN901紅外溫度感測器51程式到Arduino程式的轉換,如果程式碼越來越多這樣程式的可維護性會隨之降低,也不適合團度開發。我們應該把常用的檔案封裝成C++庫,這樣在複用的時候就會方便很多。
    首先讓我們來看下官方的C++類庫是怎樣的結構,以官方的LCD類庫為例,如下圖所示:

未命名.jpg


上面的檔案大體是這樣的結構:

檔名 檔案型別 檔案說明
keywords.txt keywords.txt Arduino庫色標檔案
LiquidCrystal.h .h C++標頭檔案
LiquidCrystal.cpp .cpp C++程式檔案



以下幾種檔案的作用如下:

.h 標頭檔案:標頭檔案作為一種包含功能函式、資料介面宣告的載體檔案,用於儲存程式的宣告(declaration),而定義檔案用於儲存程式的實現 (implementation)。

.cpp 檔案:C++程式原始檔主要的邏輯寫在這裡。

keywords.txt 檔案:用來定義庫在程式中顯示關鍵字的顏色。

下面讓我們來做個實際的例子將我們昨天寫的程式改造成C++類庫 可以點選這裡

TH901.rar (992 Bytes, 下載次數: 174)

2012-9-12 16:58 上傳 點選檔名下載附件

下載上一講中的程式

首先我們來嘗試下標頭檔案的編寫 有關巨集定義的具體用法可以參見5樓zcbzjx的詳細說明:)

ARDUINO 程式碼複製列印
  1. #ifndef TH901_H  //根據條件進行編譯
  2. #define TH901_H
  3. //我們在這中間新增程式
  4. #endif            //條件編譯結束
  1. #ifndef TH901_H  //根據條件進行編譯
  2. #define TH901_H
  3. //我們在這中間新增程式
  4. #endif            //條件編譯結束



我們在這中間新增程式主體的程式碼部分,首先來新增程式的標頭檔案,需要引用什麼都可以加進來

ARDUINO 程式碼複製列印
  1. #include <inttypes.h> //引用相關的標頭檔案
  1. #include <inttypes.h> //引用相關的標頭檔案



之後我們可以預定義一些需要的常量,這樣維護起來比較方便,如果常量值改變只要統一修改這裡就好

ARDUINO 程式碼複製列印
  1. #define TN901_OTADDRESS 0x4c
  2. #define TN901_ETADDRESS 0x66
  3. #define TN901_ENDADDRESS 0x0d
  1. #define TN901_OTADDRESS 0x4c
  2. #define TN901_ETADDRESS 0x66
  3. #define TN901_ENDADDRESS 0x0d



接下來我們來定義變數和宣告程式的方法,需要外部呼叫和訪問的就宣告成public,不需要外部訪問的就宣告為private

ARDUINO 程式碼複製列印
  1. class TN901     //定義類主體及類名
  2. {
  3.   public:  //以下定義為公共方法
  4.     short ET;   //環境溫度輸出
  5.     short OT;   //目標溫度輸出
  6.     void Init(int TN_Data,int TN_Clk,int TN_ACK); //程式初始化
  7.     void Read();  //讀取方法
  8.     void ReadData(char flag); //讀取指定地址的資料
  9.     int  GetData(); //獲取資料
  10.   private:  //以下定義為私有方法
  11.     int _dataPin;  //資料引腳
  12.     int _clkPin;   //時鐘引腳
  13.     int _ackPin;   //反饋引腳
  14.     unsigned char  Data[5];  //資料陣列
  15. };
  1. class TN901     //定義類主體及類名
  2. {
  3.   public:  //以下定義為公共方法
  4.     short ET;   //環境溫度輸出
  5.     short OT;   //目標溫度輸出
  6.     void Init(int TN_Data,int TN_Clk,int TN_ACK); //程式初始化
  7.     void Read();  //讀取方法
  8.     void ReadData(char flag); //讀取指定地址的資料
  9.     int  GetData(); //獲取資料
  10.   private:  //以下定義為私有方法
  11.     int _dataPin;  //資料引腳
  12.     int _clkPin;   //時鐘引腳
  13.     int _ackPin;   //反饋引腳
  14.     unsigned char  Data[5];  //資料陣列
  15. };



這樣我們一個頭檔案就寫好了

ARDUINO 程式碼複製列印
  1. /**
  2.  * TN901 Library
  3.  * 說明: 臺灣燃太紅外TN901感測器庫
  4.  * 作者: 水樂天
  5.  * Email: [email][email protected][/email]
  6.  */
  7. #ifndef TH901_H  
  8. #define TH901_H
  9. #include <inttypes.h> //引用相關的標頭檔案
  10. #define TN901_OTADDRESS 0x4c
  11. #define TN901_ETADDRESS 0x66
  12. #define TN901_ENDADDRESS 0x0d
  13. class TN901     //定義類主體及類名
  14. {
  15.   public:  //以下定義為公共方法
  16.     short ET;   //環境溫度輸出
  17.     short OT;   //目標溫度輸出
  18.     void Init(int TN_Data,int TN_Clk,int TN_ACK); //程式初始化
  19.     void Read();  //讀取方法
  20.     void ReadData(char flag); //讀取資料
  21.     int  GetData(); //獲取資料
  22.   private:  //以下定義為私有方法
  23.     int _dataPin;  //資料引腳
  24.     int _clkPin;   //時鐘引腳
  25.     int _ackPin;   //反饋引腳
  26.     unsigned char  Data[5];  //資料陣列
  27. };
  28. #endif            //程式結束
  1. /**
  2.  * TN901 Library
  3.  * 說明: 臺灣燃太紅外TN901感測器庫
  4.  * 作者: 水樂天
  5.  * Email: [email][email protected][/email]
  6.  */
  7. #ifndef TH901_H  
  8. #define TH901_H
  9. #include <inttypes.h> //引用相關的標頭檔案
  10. #define TN901_OTADDRESS 0x4c
  11. #define TN901_ETADDRESS 0x66
  12. #define TN901_ENDADDRESS 0x0d
  13. class TN901     //定義類主體及類名
  14. {
  15.   public:  //以下定義為公共方法
  16.     short ET;   //環境溫度輸出
  17.     short OT;   //目標溫度輸出
  18.     void Init(int TN_Data,int TN_Clk,int TN_ACK); //程式初始化
  19.     void Read();  //讀取方法
  20.     void ReadData(char flag); //讀取資料
  21.     int  GetData(); //獲取資料
  22.   private:  //以下定義為私有方法
  23.     int _dataPin;  //資料引腳
  24.     int _clkPin;   //時鐘引腳
  25.     int _ackPin;   //反饋引腳
  26.     unsigned char  Data[5];  //資料陣列
  27. };
  28. #endif            //程式結束



接下來我們來書寫程式的主體,就是CPP檔案。首先我們引用已經寫好的程式標頭檔案

ARDUINO 程式碼複製列印
  1. #include "TN901.h"
  1. #include "TN901.h"



之後我們引用一些需要的庫檔案,需要哪些可以參見標準C++的庫檔案說明

ARDUINO 程式碼複製列印
  1. #include "TN901.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <inttypes.h>
  5. #include "Arduino.h"
  1. #include "TN901.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <inttypes.h>
  5. #include "Arduino.h"



然後我們逐一實現在標頭檔案中定義的方法,注意型別要與定義型別相對應。所有的方法都要屬於你定義的類名,格式如下

ARDUINO 程式碼複製列印
  1. 類名::方法名
  1. 類名::方法名




另外i啊我們要為程式的封裝考慮程式應有的結構,總之是怎樣使你的庫使用起來最方便,在一般的邏輯中儘量減少呼叫的次數。我們可以把程式的邏輯分割為幾個部分來書寫。如:

ARDUINO 程式碼複製列印
  1. 1.初 始 化
  2. 2.實現功能
  3. 3.顯示資料
  1. 1.初 始 化
  2. 2.實現功能
  3. 3.顯示資料



當然這個邏輯以具體的程式為準。

我們來嘗試寫第一個初始化的方法,這樣我們可以自己定義程式的埠。

ARDUINO 程式碼複製列印
  1. //初始化TN901感測器
  2. void TN901::Init(int TN_Data,int TN_Clk,int TN_ACK)
  3. {
  4.   //定義私有埠
  5.   _dataPin=TN_Data;
  6.   _clkPin=TN_Clk;
  7.   _ackPin=TN_ACK;
  8.   pinMode(_clkPin, INPUT);
  9.   pinMode(_ackPin, OUTPUT);
  10.   digitalWrite(_ackPin,HIGH);
  11. }
  1. //初始化TN901感測器
  2. void TN901::Init(int TN_Data,int TN_Clk,int TN_ACK)
  3. {
  4.   //定義私有埠
  5.   _dataPin=TN_Data;
  6.   _clkPin=TN_Clk;
  7.   _ackPin=TN_ACK;
  8.   pinMode(_clkPin, INPUT);
  9.   pinMode(_ackPin, OUTPUT);
  10.   digitalWrite(_ackPin,HIGH);
  11. }



然後我們書寫程式的主要邏輯部分

ARDUINO 程式碼複製列印
  1. //讀取資料
  2. void TN901::Read()
  3. {
  4.   digitalWrite(_ackPin,LOW);
  5.   ReadData(TN901_OTADDRESS);//目標溫度的第一個位元組為0x4c   
  6.   if((Data[0]==TN901_OTADDRESS)&&
  7.      (Data[4]==TN901_ENDADDRESS))//每幀的最後一個位元組為0x0d   
  8.   {   
  9.     GetData_OT();  
  10.   }
  11.   delay(1); //等待1毫秒
  12.   digitalWrite(_ackPin,LOW);
  13.   ReadData(TN901_ETADDRESS);//環境溫度的第一個位元組為0x66      
  14.   if((Data[0]==TN901_ETADDRESS)&&
  15.      (Data[4]==TN901_ENDADDRESS))//每幀的最後一個位元組為0x0d   
  16.   {   
  17.     GetData_ET();
  18.   }
  19. }
  1. //讀取資料
  2. void TN901::Read()
  3. {
  4.   digitalWrite(_ackPin,LOW);
  5.   ReadData(TN901_OTADDRESS);//目標溫度的第一個位元組為0x4c   
  6.   if((Data[0]==TN901_OTADDRESS)&&
  7.      (Data[4]==TN901_ENDADDRESS))//每幀的最後一個位元組為0x0d   
  8.   {   
  9.     GetData_OT();  
  10.   }
  11.   delay(1); //等待1毫秒
  12.   digitalWrite(_ackPin,LOW);
  13.   ReadData(TN901_ETADDRESS);//環境溫度的第一個位元組為0x66      
  14. 相關推薦

    如何自己編寫Arduino支援C++

    我們在上一講中實現了一個TN901紅外溫度感測器51程式到Arduino程式的轉換,如果程式碼越來越多這樣程式的可維護性會隨之降低,也不適合團度開發。我們應該把常用的檔案封裝成C++庫,這樣在複用的時候就會方便很多。     首先讓我們來看下官方的C++類庫是怎樣的結構,

    Nuget釋出屬於自己C#

    前期必備 Visual Studio 2017 要安裝 nuget.exe CLI,從 nuget.org 官網下載,將 .exe 檔案儲存到合適的資料夾 申請 API 金鑰 登入你的 nuget.org 帳戶,或建立一個帳戶(如果你還沒有帳戶)。

    C#導入c++ dll報找不到dll文件 masm32調用c++

    dll sca masm32 ++ 時也 類型 dumpbin exports 另一個   最近需要在C#下調用一個c++ dll庫,不管怎樣dllimport就是報錯找不到該dll文件,路徑、函數名稱、參數、dllimport參數逐個檢查確認無誤也無濟於事,無奈想用其他語

    由於C++版本不同導致的OpenCV編譯鏈接錯誤

    c++類 庫文件 它的 int down error: string ray 無法 太長不看版:GCC4和GCC5使用的C++標準庫下,string的名字不一樣,導致鏈接錯誤。 之前在Ubuntu下使用OpenCV的時候一切正常。後來再次編譯的時候,連接器提示有些庫函數找不

    c++stl

    把c++視訊全部又看了一遍,總結了stl類庫 總結如下: vector: vector向量中,可以用[x][y]表示第x-1位裡的第y-1個元素; s[i] //  直接以下標方式訪問容器中的元素 s.front() //  返回首元素 s.back() // 

    Java呼叫C#

    原帖地址:https://bbs.csdn.net/topics/390624108   總體分三步走: 準備一個 C# 類庫 (dll) 編寫一個java 類 編譯 java 類並打包成jar,即可

    C#:ini檔案操作

    C#類庫 ——ini檔案操作類 1.類庫介紹     在開發應用軟體時,ini檔案常用於軟體的相關配置,以下為ini檔案的相關結構及示例;ini檔案具有節(section)和鍵(key)兩個層級,節用”[]”包含,然後下一行為對應鍵名以及鍵值,

    JNI方法呼叫C++

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    C#呼叫C++的幾種方式

    1、  直接呼叫C++類庫中的公共方法 使用DllImport特性對方法進行呼叫,比如一個C++類庫SampleCppWrapper.dll中的公共方法: extern "C" __declspec(dllexport) int __stdcall Add(int n1, int

    使用C#呼叫C++

    環境:win10+VS2017 過程介紹: 1.使用C++編寫一個動態庫(DLL); 2.將DLL內函式匯出; 3.使用C#進行呼叫; 4.方法呼叫; 5.在VS進行除錯; 1.使用C++編寫簡單的DLL; 1.1建立專案(x64);  在VS2017中新建->專案->Visua

    C/C++ 開發參考

    剛貼了自己一篇文章,在:http://blog.chinaunix.net/space.php?uid=25414438&do=blog&id=131043 再貼到論壇這裡,分享給大家。 -----------------------------------

    [翻譯]-Linux上C++的動態載入

    摘要:本文是翻譯文章,主要介紹了執行時過載C++類庫的技術,包括了Linux上的庫動態載入介面、C++類庫的動態載入技術點及實現、自動載入技術等。最後給出了兩個應用案例及相關的原始碼。 關鍵字:動態載入,C++類,Linux 原文連結:http://porky.lin

    Java 通過 JNI 呼叫 C/C++

    說明 由於一些涉及到裝置或底層操作的類庫,大多是C或C++語言編寫的,對於Java Web開發者,在涉及到相應的專案中,不可能再去將相應的類庫用Java重寫。這時,就需要通過Java程式碼去呼叫C/C++的類庫來完成工作。 操作環境: - JDK 1.8.

    C#製作原始碼的幫助文件 chm幫助文件 C#幫助文件生成

    我們自己會寫一個核心類庫,提供給他人使用,如果沒有幫助文件,是無法告訴別人如何使用你的類庫的,即便是你有很好的註釋,用以下工具就可以生成 .chm的幫助文件了。 1、下載Sandcastle Help File Builder: 2、下載sandcastle: 1、

    C#編譯及使用

     1 using System; 2 using System.Data.SqlClient; 3  4  5 publicclass DataReaderSql 6   { 7 publicstaticint Main(string[] args) 8   { 9 string        source 

    C++集錦(轉載)

    SGI STL庫的跨平臺可移植版本。 準標準庫——Boost Boost 庫是一個經過千錘百煉、可移植、提供原始碼的C++庫,作為標準庫的後備,是C++標準化程序的發動機之一。 Boost庫由C++標準委員會庫工作組成員發起,在C++社群中影響甚大,其成員已近2000人。 Boost庫為我們帶來了最新、

    .Net呼叫C++方法

    .Net除了效能外,還有一個不得不注意的問題就是安全問題。我們可以給.Net程式集加殼,混淆(.NET Reactor工具)。除了給.Net加殼,混淆外,還有一個方法,就是將重要的邏輯,計算放在C++類庫中。C#呼叫C++類庫和呼叫Windows API一樣,利用DllI

    entity framework 6 自己編寫的通用資料

    public class BaseDAL { string strConn = ""; public BaseDAL(string connString) { strConn = connSt

    C#推薦 拼多多.Net SDK,開源免費!

    # 背景介紹 近兩年拼多多的發展非常迅速,即便口碑一般,也沒有網頁端,奈何我們已經全面小康,6億月收入1000以下,9億月收入2000以下,所以因為價格原因使用拼多多的使用者也越來越多了。同樣的,拼多多也開放了部分API介面,提供給開發者使用,開放平臺也是一如既往的拼多多,沒法跟淘寶、京東等相比,至今沒有

    如何編寫自己arduino

    當我們在arduino中有大量的程式碼需要在不同的工程中重複時,我們可以把這段程式碼進行封裝,那麼由此我們就想到了要編寫自己的arduino類庫。這個工作並不複雜,稍有面對物件程式設計經驗的小夥伴即可比較容易完成。下面我們以例項的方式將步驟一一列出。 我們以,我前面編寫的《Ardui