2012-11-01 165 views
1

我有一些代碼,我想投入它使用另一個庫,SoftwareSerial庫。現在我將SoftwareSerial.h和SoftwareSerial.cpp文件添加到我創建的庫所在的文件夾中。創建一個圖書館一個Arduino

我的頭文件看起來是這樣的:

#ifndef MyLibrary_h 
#define MyLibrary_h 

#include "Arduino.h" 
#include "SoftwareSerial.h" 

#define MyLibrary_VERSION  1  // software version of this library 


//DEFINE ALL CLASS VARIABLES 

#define DATA_BUFFER_SIZE 50 //soft serial has 63 byte buffer. 

class MyLibrary 
{ 
    public: 
     MyLibrary(uint8_t port_in, uint8_t port_out); 
     float getSomeValue(uint8_t some_index); 
    private: 
     SoftwareSerial _serial; 
       //Not sure if I should add the constructors below to the above declaration. 
       //(uint8_t in_pin=4, uint8_t out_pin=5, bool logic_reversed = false); 
     float convertSomeValue(byte upperbyte, byte lowerbyte); 
     void flushSerialBuffer(); 
}; 

#endif 

我.cpp文件看起來是這樣的:

#include "Arduino.h" 
#include "MyLibrary.h" 
#include "SoftwareSerial.h" 


MyLibrary::MyLibrary(uint8_t in_pin, uint8_t out_pin) 
{ 

    bool logic_reversed = false; 
    this->_serial(in_pin*, out_pin*, logic_reversed); 
     //I tried the declaration below as well. 
    //SoftwareSerial _serial(in_pin*, out_pin*, logic_reversed); 
} 

float MyLibrary::getSomeValue(uint8_t sensor_index) { 
    float someValue = 1.1; 
    return someValue; 
} 

float MyLibrary::convertSome(byte upperbyte, byte lowerbyte) { 
    float someValue = 0.9; 
    return someValue; 
} 

void MyLibrary::flushSerialBuffer() { 
    //Flush serial buffer 
    while(_serial.available()) 
     char c = _serial.read(); 
} 

我想SoftwareSerial是在在MyLibrary(最好是靜態的,但不是私人領域必要),但我已經嘗試了很多是宣佈它,但似乎沒有任何工作。我不斷收到類似no matching function for call to 'SoftwareSerial::SoftwareSerial()invalid use of qualified-name 'MyLibrary::_serial'的錯誤。

我通過在我的.h文件中聲明static SoftwareSerial _serial;,並在我的.cpp文件的頂部聲明SoftwareSerial MyLibrary::_serial(4,5,false);來編譯好。問題是,我想設置的_serial端口在我的構造函數在MyLibrary(這樣我就可以創建一個使用特定的輸入/輸出引腳SoftwareSerial一個在MyLibrary),而不是讓他們在.cpp文件的頂部顯式聲明。

我對C編碼和Arduino不是很熟悉,所以如果有人能向我解釋如何在.h文件中正確地聲明這些文件並將它們與MyLibrary構造函數中的正確端口一起實例化或一個MyLibrary.begin()函數(或類似的東西)。

預先感謝您有益意見。

回答

5

你需要做的是讓你的構造做初始化如下:

class MyLibrary{ 
public: 
    MyLibrary(uint8_t, uint8_t); 
    //... 
private: 
    SoftwareSerial _serial; 
    //... 
}; 

MyLibrary::MyLibrary(uint8_t in, uint8_t out) 
    : _serial(in, out) 
{ 
    //do initialization 
} 

這句法可能看起來很奇怪在第一,但儘管它是不是很漂亮,它明確區分的初始化變量VS​​對變量操作,這恐怕是將初始化在構造函數體可以使略顯模糊。作爲一項規則,除非你使用這個語法來初始化成員變量,C++會調用默認的構造函數,這將導致一個編譯錯誤,當且僅當該成員不具有可調用默認的構造函數。

+0

太感謝你了,這正是我一直在尋找,這工作得很好對在MyLibrary的構造函數初始化SofwareSerial。爲了完整起見,如果我在頭文件中聲明它爲'static SoftwareSerial _serial;',我將如何初始化它?這是甚至用靜態變量的好習慣嗎?在構造函數中初始化它們對我來說看起來不太合適。 – methodMan

+0

我假設你的意思是一個靜態成員變量?在這種情況下,您需要選擇一個.cpp文件,您希望該對象「存活」並使用「SoftwareSerial DataLogger :: _ serial(a,b);'。 –

+1

對不起'MyLibrary :: _ serial(a,b)'。雖然MyLibrary聽起來更像是一個名字空間的名字,而不是一個類... –

相關問題