• 專注電子技術學習與研究
    當前位置:單片機教程網 >> Arduino >> 瀏覽文章

    使用 Arduino Eclipse 插件進行OOP編程及類庫開發

    作者:未知   來源:互聯網   點擊數:  更新時間:2014年08月16日   【字體:

     

    本文是《[Arduino] Develop Library with Arduino eclipse plugin》的中文版本,并增加一點本土內容。之所以先寫英文的,是因為寫作過程中,需要和插件作者保持溝通,還請各位見諒。

    eclipse.baeyens.it 開發中的 Arduino Eclipse 插件,能快速將eclipse打造為Arduino的開發平臺。從目前的經驗看來,開發的部分基本能實現完全的替代。雖然少了串口助手的部分,但平心而論,ADE(Arduino “官方”標準開發環境)的串口助手是很弱的。因為只能傳遞可見字符數據,沒法任意發送0-255的單字節數據。所以這個集成的Serial Monitor還是比較雞肋的。所以用自己喜歡而且順手的就是,并不要緊。使用 Arduino Eclipse 插件,在 eclipse 上進行開發的Arduino程序,同樣能方便地移植到 ADE 上,在開源社區分享,也沒有問題。而開發效率、編譯速度、下載速度,都將大幅提升,爽得一塌糊涂。

    在這款插件出現之前,Eclipse 就已經可以用來作 Arduino 的IDE了,但配置過程相當崩潰,有插件就爽了很多,能輕松實現平臺搭建。

    本文結合Arduino eclipse Plugin 英文向導 and Arduino playground 的 LibraryTutorial 做一個使用eclipse開發Arduino類庫的分步驟教程。建議先查閱一下這2處的內容,這樣看下文會輕松很多。


    1. 安裝 Eclipse 及 Arduino 插件
     
    插件官方安裝向導 ,英文很簡單,E文不太熟悉的朋友,配合字典就能搞定。我的經驗就是,安裝帶有CDT(C/C++ Development Kit)的eclipse就是了。如果之前已經在用 eclipse 進行 Java、Ruby或其它開發的朋友,并不需要重新下載,直接安裝CDT插件就是了,畢竟Arduino用的是C++。使用 Arduino 插件進行開發,并不需要提前安裝 AVR 插件,感覺是已經被Arduino插件集成了,所以安裝配置就更簡單許多。

    之前根據網絡上的各類資料,重新編輯過一篇安裝 Eclipse 3.7 Indigo 學習 Java 的blog,里面提到了漢化如何進行,有興趣的朋友不妨去看看,在那個基礎上,安裝CDT,插件,就能直接用來開發Arduino了。那個時候剛剛接觸 eclipse,用起來小心翼翼,現在就放開了許多,都敢碰了,呵呵。

    不過一個eclipse里面一下運行太多插件,對速度還是有影響的,為Arduino開發,我另外整理了一個較為“純凈”的eclipse: Eclipse 3.7 Indigo + CDT + Arduino Plugin + Subclipse

    Eclipse是綠色軟件,復制一份原始的安裝包就好了。其中 Subclipse 用于版本控制以及在 Google code 進行代碼托管,非常方便。

    2. 從一個 Sketch 開始

    在安裝及配置好 Arduino Eclipse 插件之后

    1) 新建一個工作空間,例如, “H:\workspace\myArduinoLibs”.

    2) 新建一個sketch, 例如, “MorseTest”


    在項目管理器窗口/工作空間目錄下。會出現2個文件夾。其中一個所選用的Arduino平臺型號命名,作為 Arduino Core,里面大致的內容就是與該板參數相匹配的Arduino核心庫。每次使用一個新的工作空間,這個Arduino Core文件夾都會被新建。但如果再次基礎上,添加一個基于同樣 Arduino 平臺的 Sketch 時,不會重復新建 core 文件夾,它為自動在工作空間內共享(當然,如果不是很有把握,最好也別去改它)。如果后來在同一工作空間下,使用不同的 Arduino 平臺開發,將會新建一個新平臺的Core文件夾。

    3) 構建 Core(不過并不必要):點擊 Core 文件夾, “Arduino_UNO”,后點擊工具欄的小錘子圖標。
    4) 構建 sketch,點擊 Sketch文件夾, “MorseTest”,后點擊工具欄的小錘子圖標。如果跳過了剛才的第3步,那么此刻編譯器也會先構建 Core,再構建 Sketch。注:構建,Build,Make,就是編譯、鏈接的意思。如果光點擊程序文件,可能構建不出什么東西,還是要選擇工程文件夾,再進行構建。因為一次構建構建的是整個Project.


    如果插件安裝正確的話,此處的構建,應該沒什么問題,也就是說編譯、鏈接都應該沒問題,畢竟現在什么代碼都沒輸入進去么。

    不過值得注意的是,在使用目前的 Arduino Core 的過程中,可能會出現編譯后帶有警告的情況。這些或許是ADE內部自動隱藏或是降低了警告級別造成的。不必擔心,程序一般情況下依然是可以運行的。相信隨著 Arduino 底層庫的不斷完善,這些警告都會慢慢消失的。在我個人的實踐中,基本都要加上 “extern HardwareSerial Serial;” 這句聲明,才能正常使用串口對象,感覺內建的Serial實例,是以類似全局變量的形式保存, 而在調用的時候,是要聲明一下。但是在ADE中插入這句聲明,也不會影響編譯。所以,就放心地加進去咯。至少從ANSI的標準來看,代碼是規范了不少。

    5) 建議此時,可以通過點擊工具欄的“AVR”按鈕,將這個空的 Sketch 下載(中文習慣都是說“下載”,就像“XX下載器”,而英文版本里面偏偏都是用上傳“Upload”,比較無語)到Arduino的板子上,測試連接通訊是否正常。這里,可以理解為和 ADE 一樣,編譯和下載是分開的。但是ADE里面,下載還包含了編譯,而且編譯得很慢。Eclipse里面,這兩個步驟是完全獨立的,所以,一次次點擊“下載”,可能下載的都是老文件,如果忘記重新編譯的話。新手要注意這一點。

    6) 將 librayTutorial 里的代碼拷貝至 “MorseTest.cpp”. 頭文件 “MorseTest.h”就不用去動它了,不需要對其進行任何編輯。

    // Do not remove the include below
     #include "MorseTest.h"
     
    void dot();
    void dash();
     
    int pin = 13;
     
    //The setup function is called once at startup of the sketch
    void setup() 
    {
    // Add your initialization code here
            pinMode(pin, OUTPUT);
    }
     
    // The loop function is called in an endless loop
    void loop()
    {
    //Add your repeated code here
            dot();   dot(); dot();
            dash(); dash(); dash();
            dot();   dot(); dot();
            delay(3000);
    }
     
    void dot()
    {
            digitalWrite(pin, HIGH);
            delay(250);
            digitalWrite(pin, LOW);
            delay(250);
    }
     
    void dash()
    {
            digitalWrite(pin, HIGH);
            delay(1000);
            digitalWrite(pin, LOW);
            delay(250);
    }
    

    此處較例程添加了 dot() 和 dash() 的聲明,相信有C/C++編程經驗的朋友都知道是為什么。因為這2個函數,都放置在 loop() 函數后,而Eclipse里面的GNU/GCC編譯器是對于規范要求比較嚴格的,要么放在loop()之前,要么加聲明,否則就是無法編譯通過。ADE則相對寬松一些,感覺怎么寫都行,ADE優化過的編譯器會自動彌補這些問題,讓規則顯得更加寬松。但作為嚴謹的 C/C++ 開發人員來說,遵守嚴謹的規則,對于保證程序正確運行、排錯,是相當重要的,而且一般都比較都已經是習慣了。同樣,在ADE中添加聲明,也同樣不會影響到編譯。

    現在就可以開始體驗到 Eclipse 的強悍之處了:

    • “Tab” 鍵可以正常反應了,ADE中竟然直接用2個空格替代,真是要吐槽一下。而且 Shift+Tab 也能用了,調整縮進爽很多。
    • 各種代碼高亮
    • Ctrl+Shift+F 進行自動排版。排版的樣式,可以在 Preferences -> C/C++ -> Formatter 里面自定義,我個人當然是喜歡花括號獨占一行而且對其的樣式~
    • Alt+/ 進行自動補齊,默認情況下,按“.”也會有完整的提示框彈出。有VS使用經驗的人,一定非常依賴這個功能,:)
    • 實時的錯誤及警告提示,有的時候倒也不必驚慌,或許重新Make一下,就消失了
    • Ctrl+左鍵單擊,查看引用,這個是我的最愛,查看Arduino庫變得非常輕松,終于不用幾個文檔翻來倒去了。

    這幾條一說,基本都想把ADE扔一邊了吧~ 那還不趕緊試一下~

    7) 構建并下載,都沒錯的話,應該可以看到Arduino上Pin13的LED開始發出“三短三長三短”的SOS信號了。

    4. 從 POP 面向過程 到 OOP 面向對象

    1) 在 Sketch 項目內為 類庫 library 新建一個文件夾,本例中,命名為“Morse”

    2) 在這個 類庫文件夾 中新建一個類,

    會同時建立2個文件,.h的頭文件,和.cpp的源文件。什么代碼都還沒寫,eclipse 已經把構造函數,析構函數的框架都搭起來了。

    3) 在類頭文件“Morse.h”中,包含引用 “Arduino.h”

    除非是建一個純C++的類,或者是應用邏輯層的類,否則如果涉及到 Arduino 的底層硬件操作,一般也就是引用“Arduino.h”這個頭文件就好了,對于IO設置,位運算都有現成的函數可用。而且作為一個Arduino的 sketch,不管怎么樣都會包含這個頭文件的,類庫中就包含一下,也不會對最終sketch的文件大小會有什么影響。而且一個“Arduino.h”似 乎就包含了所有可能會用到 Arduino 函數庫,很方便。寫類,自然還是要學習一下C++的編程(學C++和學VC是2個概念)。不過大體上,可以想象成在寫一個沒有setup()和 loop()的sketch。

    4) 寫類

    如 librayTutorial所示, Morse.h:

    #ifndef MORSE_H_
    #define MORSE_H_
     
    #include "Arduino.h"
     
    class Morse
    {
    public:
            Morse(int pin);
            virtual ~Morse();
            void dot();
            void dash();
     
    private:
            int _pin;
     
    };
     
    #endif 
    

    Morse.cpp:


    #include "Morse.h" Morse::Morse(int pin) { // TODO Auto-generated constructor stub _pin = pin; pinMode(_pin, OUTPUT); } Morse::~Morse() { // TODO Auto-generated destructor stub } void Morse::dot() { digitalWrite(_pin, HIGH); delay(250); digitalWrite(_pin, LOW); delay(250); } void Morse::dash() { digitalWrite(_pin, HIGH); delay(1000); digitalWrite(_pin, LOW); delay(250); }

    例程里的代碼,和Eclipse的代碼的主要不同之處,在于在eclipse這邊過了一個虛析構函數。這在C++程序里面是非常常見的,讓類可以繼續得到繼承,是規范的寫法。相信雖然ADE的這個例程沒這個東西,但是也會欣然接受這種讓類定義更加完整的做法。

    這樣,一個最簡單的Morse類庫就寫好了。使用面向對象編程新建類,不單單可以用在編寫類庫,更應該用在進行應用類,或者說實現中間層邏輯類的開發,也 同樣適用。這樣,就能把傳統的面向過程的編程,轉變為面向對象的編程。對于玩嵌入式底層開發的朋友來說,可能會感覺這樣損失了執行效率,還增加了程序的大 小。但是對于大多數用Arduino玩應用的朋友來講,我相信還是會舍得這些硬件開銷。仁者見仁智者見智。

    5) 調用類

    回到Sketch, “MorseTest.cpp”。因為大部分的功能代碼已經轉移(更專業的叫法,就是“封裝”)到類中。所以主代碼就立馬變得整潔美觀了。記得在頭部,對類進行引用,#include “Morse.h”

    // Do not remove the include below

    #include "MorseTest.h"

     

    #include "Morse.h" // The header of the class just created

     

    Morse morse(13);

     

    //The setup function is called once at startup of the sketch

    void setup()

    {

    // Add your initialization code here

    }

     

    // The loop function is called in an endless loop

    void loop()

    {

    //Add your repeated code here

            morse.dot(); morse.dot(); morse.dot();

            morse.dash(); morse.dash(); morse.dash();

            morse.dot(); morse.dot(); morse.dot();

            delay(3000);

    }

     

     

    6) 構建OOP工程

    點擊小錘子圖標進行構建,此時會冒出來很多錯誤……

    主要原因是 Sketch 中雖然包含了類庫,但鏈接器并不知道去哪里找它,所以要添加類庫的路徑。

    a) 在項目管理器中,右鍵單擊 Sketch 文件夾,”MorseTest”.
    b) 點擊 “Properties”.
    c) 進入 “C/C++ General -> Path and Symbols”,頁
    d) 在 “Includes” 標簽中,在左邊language欄中選擇”GNU C++”, 點擊右側的”Add…”按鈕。

    e) 在”Add directory path”對話框中選擇 “Workspace…”

    f) 找到類庫的文件夾 “Morse”, 點擊 “OK”.

    g) 類庫路徑被添加進來,如下圖所示。點擊“OK”關閉窗口

    h) 如果這個框框跳出來,就點“Yes”

    i) 重新點擊Sketch文件夾,并構建,現在應該是0錯誤,0警告了。
    j) 下載到Arduino板子上,實現的功能,和早先所有程序都堆在一起的而且面向過程的Sketch是一樣的。

    5. 在ADE中,使用類庫

    1) 將類庫文件夾(“Morse”)復制至ADE所在文件夾的“libraries”文件夾 (“H:\arduino-1.0\libraries\”)內。
    2) 打開ADE,就可以在菜單 “Sketch->Import Library…” 中找到Morse類了。(其實ADE還是實現了很多不錯的功能呢)

    3) 點擊它 “#include ” 這句話,就會被添加到新的這個Sketch里面。
    4) 從eclipse的sketch,MorseTest.cpp, 復制代碼至ADE 除了
    #include “MorseTest.h” ADE會自己生成一個類似的文件,或者壓根就不需要吧,反正不用這個東西了。
    #include “Morse.h” 因為導入類庫的時候,已經將這個頭文件包含進來了。
    5) 編譯并下載,應該是沒有問題。

    6) 在ADE的libraries文件夾內的類庫文件夾,“Morse”中,新建一個“examples”文件夾。把剛才復制過來的sketch保存進去,并命名為“SOS”

    7) 退出 ADE, 并再次打開。 可以看到 SOS 程序作為 Morse 庫的一個實例,出現在菜單里。也就是說現在Morse類,就像ADE已經集成的這么多類一樣,可以被導入,并且還提供例程。

    6. 在 eclipse 中使用類庫

    1 sketch = 1 main = 1 project. Main() 函數作為C/C++程序的入口,一個項目中只允許出現一次,否則編譯器無法正確進行編譯。所以,不能在類的項目(“MorseTest”)中,同時出現多個setup()和loop()。

    如果要單獨新建一個使用自定義類的Arduino工程(Sketch),最穩妥的方法,還是使用官方指南里面的方法從ADE目錄中導入類。

    如果希望為單個類庫,編寫多個示例代碼。我個人的做法,就是將eclipse中的測試代碼,復制到ADE中,以ino格式保存至ADE相應類庫的 examples文件夾內。所以,其實在開發過程中,我的測試文件,”MorseTest.cpp”是不斷變化的,當測試通過后,就被另存為ino格式。 個人的習慣,是不太想為開發測試中的類庫,新建一個又一個的工程,畢竟大多數測試代碼都是比較短小簡單的,所以做個備份,或者存個INO就好。記得每次升 級類庫的時候,也講ADE的libraries的老類庫進行覆蓋。

    總結一下,ADE確實做了很多事情,讓編程序看起來變得更加簡單。但是作為代碼編輯器來講,有經驗的程序員可能用起來會比較崩潰,或者說習慣于 VS, eclipse這類高級IDE的程序員用起來,就會感覺相當奔潰。(對于那些用記事本直接玩的孩紙,那還是傷不起……)。而借助 Arduino Eclipse 插件,使用eclipse進行開發,就會是Arduino的開發變得非常輕松、愉快,而且高效。

    趕快來試試吧~

     

    關閉窗口

    相關文章

    国产农村精品一级毛片视频_亚洲Av无码专区国产乱码在线观看_亚洲综合国产Av_天天影视网天天综合色