如何自己編寫Arduino支援的C++類庫
我們在上一講中實現了一個TN901紅外溫度感測器51程式到Arduino程式的轉換,如果程式碼越來越多這樣程式的可維護性會隨之降低,也不適合團度開發。我們應該把常用的檔案封裝成C++庫,這樣在複用的時候就會方便很多。
首先讓我們來看下官方的C++類庫是怎樣的結構,以官方的LCD類庫為例,如下圖所示:
上面的檔案大體是這樣的結構:
檔名 | 檔案型別 | 檔案說明 |
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的詳細說明:)
- #ifndef TH901_H //根據條件進行編譯
- #define TH901_H
- //我們在這中間新增程式
- #endif //條件編譯結束
- #ifndef TH901_H //根據條件進行編譯
- #define TH901_H
- //我們在這中間新增程式
- #endif //條件編譯結束
我們在這中間新增程式主體的程式碼部分,首先來新增程式的標頭檔案,需要引用什麼都可以加進來
- #include <inttypes.h> //引用相關的標頭檔案
- #include <inttypes.h> //引用相關的標頭檔案
之後我們可以預定義一些需要的常量,這樣維護起來比較方便,如果常量值改變只要統一修改這裡就好
- #define TN901_OTADDRESS 0x4c
- #define TN901_ETADDRESS 0x66
- #define TN901_ENDADDRESS 0x0d
- #define TN901_OTADDRESS 0x4c
- #define TN901_ETADDRESS 0x66
- #define TN901_ENDADDRESS 0x0d
接下來我們來定義變數和宣告程式的方法,需要外部呼叫和訪問的就宣告成public,不需要外部訪問的就宣告為private
- class TN901 //定義類主體及類名
- {
- public: //以下定義為公共方法
- short ET; //環境溫度輸出
- short OT; //目標溫度輸出
- void Init(int TN_Data,int TN_Clk,int TN_ACK); //程式初始化
- void Read(); //讀取方法
- void ReadData(char flag); //讀取指定地址的資料
- int GetData(); //獲取資料
- private: //以下定義為私有方法
- int _dataPin; //資料引腳
- int _clkPin; //時鐘引腳
- int _ackPin; //反饋引腳
- unsigned char Data[5]; //資料陣列
- };
- class TN901 //定義類主體及類名
- {
- public: //以下定義為公共方法
- short ET; //環境溫度輸出
- short OT; //目標溫度輸出
- void Init(int TN_Data,int TN_Clk,int TN_ACK); //程式初始化
- void Read(); //讀取方法
- void ReadData(char flag); //讀取指定地址的資料
- int GetData(); //獲取資料
- private: //以下定義為私有方法
- int _dataPin; //資料引腳
- int _clkPin; //時鐘引腳
- int _ackPin; //反饋引腳
- unsigned char Data[5]; //資料陣列
- };
這樣我們一個頭檔案就寫好了
- /**
- * TN901 Library
- * 說明: 臺灣燃太紅外TN901感測器庫
- * 作者: 水樂天
- * Email: [email][email protected][/email]
- */
- #ifndef TH901_H
- #define TH901_H
- #include <inttypes.h> //引用相關的標頭檔案
- #define TN901_OTADDRESS 0x4c
- #define TN901_ETADDRESS 0x66
- #define TN901_ENDADDRESS 0x0d
- class TN901 //定義類主體及類名
- {
- public: //以下定義為公共方法
- short ET; //環境溫度輸出
- short OT; //目標溫度輸出
- void Init(int TN_Data,int TN_Clk,int TN_ACK); //程式初始化
- void Read(); //讀取方法
- void ReadData(char flag); //讀取資料
- int GetData(); //獲取資料
- private: //以下定義為私有方法
- int _dataPin; //資料引腳
- int _clkPin; //時鐘引腳
- int _ackPin; //反饋引腳
- unsigned char Data[5]; //資料陣列
- };
- #endif //程式結束
- /**
- * TN901 Library
- * 說明: 臺灣燃太紅外TN901感測器庫
- * 作者: 水樂天
- * Email: [email][email protected][/email]
- */
- #ifndef TH901_H
- #define TH901_H
- #include <inttypes.h> //引用相關的標頭檔案
- #define TN901_OTADDRESS 0x4c
- #define TN901_ETADDRESS 0x66
- #define TN901_ENDADDRESS 0x0d
- class TN901 //定義類主體及類名
- {
- public: //以下定義為公共方法
- short ET; //環境溫度輸出
- short OT; //目標溫度輸出
- void Init(int TN_Data,int TN_Clk,int TN_ACK); //程式初始化
- void Read(); //讀取方法
- void ReadData(char flag); //讀取資料
- int GetData(); //獲取資料
- private: //以下定義為私有方法
- int _dataPin; //資料引腳
- int _clkPin; //時鐘引腳
- int _ackPin; //反饋引腳
- unsigned char Data[5]; //資料陣列
- };
- #endif //程式結束
接下來我們來書寫程式的主體,就是CPP檔案。首先我們引用已經寫好的程式標頭檔案
- #include "TN901.h"
- #include "TN901.h"
之後我們引用一些需要的庫檔案,需要哪些可以參見標準C++的庫檔案說明
- #include "TN901.h"
- #include <stdio.h>
- #include <string.h>
- #include <inttypes.h>
- #include "Arduino.h"
- #include "TN901.h"
- #include <stdio.h>
- #include <string.h>
- #include <inttypes.h>
- #include "Arduino.h"
然後我們逐一實現在標頭檔案中定義的方法,注意型別要與定義型別相對應。所有的方法都要屬於你定義的類名,格式如下
- 類名::方法名
- 類名::方法名
另外i啊我們要為程式的封裝考慮程式應有的結構,總之是怎樣使你的庫使用起來最方便,在一般的邏輯中儘量減少呼叫的次數。我們可以把程式的邏輯分割為幾個部分來書寫。如:
- 1.初 始 化
- 2.實現功能
- 3.顯示資料
- 1.初 始 化
- 2.實現功能
- 3.顯示資料
當然這個邏輯以具體的程式為準。
我們來嘗試寫第一個初始化的方法,這樣我們可以自己定義程式的埠。
- //初始化TN901感測器
- void TN901::Init(int TN_Data,int TN_Clk,int TN_ACK)
- {
- //定義私有埠
- _dataPin=TN_Data;
- _clkPin=TN_Clk;
- _ackPin=TN_ACK;
- pinMode(_clkPin, INPUT);
- pinMode(_ackPin, OUTPUT);
- digitalWrite(_ackPin,HIGH);
- }
- //初始化TN901感測器
- void TN901::Init(int TN_Data,int TN_Clk,int TN_ACK)
- {
- //定義私有埠
- _dataPin=TN_Data;
- _clkPin=TN_Clk;
- _ackPin=TN_ACK;
- pinMode(_clkPin, INPUT);
- pinMode(_ackPin, OUTPUT);
- digitalWrite(_ackPin,HIGH);
- }
然後我們書寫程式的主要邏輯部分
- //讀取資料
- void TN901::Read()
- {
- digitalWrite(_ackPin,LOW);
- ReadData(TN901_OTADDRESS);//目標溫度的第一個位元組為0x4c
- if((Data[0]==TN901_OTADDRESS)&&
- (Data[4]==TN901_ENDADDRESS))//每幀的最後一個位元組為0x0d
- {
- GetData_OT();
- }
- delay(1); //等待1毫秒
- digitalWrite(_ackPin,LOW);
- ReadData(TN901_ETADDRESS);//環境溫度的第一個位元組為0x66
- if((Data[0]==TN901_ETADDRESS)&&
- (Data[4]==TN901_ENDADDRESS))//每幀的最後一個位元組為0x0d
- {
- GetData_ET();
- }
- }
- //讀取資料
- void TN901::Read()
- {
- digitalWrite(_ackPin,LOW);
- ReadData(TN901_OTADDRESS);//目標溫度的第一個位元組為0x4c
- if((Data[0]==TN901_OTADDRESS)&&
- (Data[4]==TN901_ENDADDRESS))//每幀的最後一個位元組為0x0d
- {
- GetData_OT();
- }
- delay(1); //等待1毫秒
- digitalWrite(_ackPin,LOW);
- ReadData(TN901_ETADDRESS);//環境溫度的第一個位元組為0x66
-
相關推薦
如何自己編寫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