编译Arduino库

时间:2016-07-17 20:41:11

标签: c++ class compilation arduino

我在Arduino中编译草图时遇到了一个奇怪的错误,可能是由于我创建的库中的错误。 这是代码:

    #include <BlueHartwin.h>

BlueHartwin bH(7,8,115200);
byte incomingByte; 

void noOp(void)
{
  Serial<<"noOp"<<endl;
};

void leftWindowDown(void)
{
  Serial<<"leftWindowDown"<<endl;
};

void setup() {
  Serial.begin(115200);
  bH.registerCmd(0,&noOp);
  bH.registerCmd(1,&leftWindowDown);

}

void loop() {

  if(bH.available())
  {
    incomingByte = bH.read()-48;
    Serial<<incomingByte<<endl;
    if (incomingByte<nrOfCommands)
      bH.runCmd(incomingByte);

  }
}

以下是图书馆的标题:

#ifndef BlueHartwin_H
    #define BlueHartwin_H

#include <SoftwareSerial.h>
#include <Streaming.h>;
#include <Arduino.h>

#define nrOfCommands 255

typedef void (* CmdFuncPtr) (); // this is a typedef to command functions


class BlueHartwin {

public:
    BlueHartwin(byte bluetoothTx,byte bluetoothRx,long baudRate);
    ~BlueHartwin();
    //void setup(byte bluetoothTx,byte bluetoothRx,long baudRate);
    boolean registerCmd(byte id,CmdFuncPtr cmdFuncPtr);
    boolean unRegisterCmd(byte id,CmdFuncPtr cmdFuncPtr);
    boolean runCmd(byte id);
    void setDataLength(byte dataLength);
    byte getDataLength();
    boolean available();
    byte read();

private:
    CmdFuncPtr setOfCmds[255];
    byte mDataLength;

};

#endif

和来源

#include "BlueHartwin.h";


SoftwareSerial bluetooth(7,8);
byte mDataLength;

BlueHartwin::BlueHartwin(byte bluetoothTx,byte bluetoothRx,long baudRate){
    bluetooth = SoftwareSerial(bluetoothTx,bluetoothRx);
    bluetooth.begin(baudRate);
}

BlueHartwin::~BlueHartwin(){

}

boolean BlueHartwin::registerCmd(byte id,CmdFuncPtr cmdFuncPtr){
    if ((id<=nrOfCommands)&&(setOfCmds[id]==0)) {
        setOfCmds[id]=cmdFuncPtr;   
        return true;
    } else return false;
}

boolean BlueHartwin::unRegisterCmd(byte id,CmdFuncPtr cmdFuncPtr){
    if (id<=nrOfCommands) {
        setOfCmds[id]=0;    
        return true;
    } else return false;
}


boolean BlueHartwin::runCmd(byte id){
    if ((id<=nrOfCommands)&&(setOfCmds[id]!=0)) {
        setOfCmds[id]();
        return true;
    } else return false;
}


void setDataLength(byte dataLength) {
    mDataLength=dataLength;
}

byte getDataLength(){
    return mDataLength;
}

boolean available(){
    return true;
}

byte read(){
    return 0;
}

这是我得到的错误:

sketch/Test_Bluehartwin00.ino.cpp.o: In function `loop':
/home/paolo/Projects/arduino/sketches/TESTS/Test_Bluehartwin00/Test_Bluehartwin00.ino:25: undefined reference to `BlueHartwin::available()'
/home/paolo/Projects/arduino/sketches/TESTS/Test_Bluehartwin00/Test_Bluehartwin00.ino:27: undefined reference to `BlueHartwin::read()'
collect2: error: ld returned 1 exit status
exit status 1

奇怪的是,我只在库类的2个公共函数中得到错误。 我真的不明白什么是错的...... 我在Ubuntu 14.04 64位下使用Arduino UNO和IDE 1.6.8。通常一切都运行良好。 提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

问题出在.cpp文件中。

这两个函数给你一个问题:

boolean available(){
    return true;
}

byte read(){
    return 0;
}

因为它们是免费/全球功能。你需要让它们成为课堂的一部分:

boolean BlueHartwin::available(){
    return true;
}

byte BlueHartwin::read(){
    return 0;
}

注意:您还必须修改其他几个:

void BlueHartwin::setDataLength(byte dataLength) {
    mDataLength=dataLength;
}

byte BlueHartwin::getDataLength(){
    return mDataLength;
} 

这些可以用同样的方法修复。