简体   繁体   English

编译错误Arduino C ++对象库

[英]Compilation error Arduino C++ object library

I'm writing a C++ Arduino library for BlueTooth communication. 我正在编写用于蓝牙通信的C ++ Arduino库。 I implemented a mechanism in order to register a custom function to be executed when a certain byte comes from the BT connection. 我实现了一种机制,以注册当某个字节来自BT连接时要执行的自定义功能。 Pratically a sort of Java Hashmap. 通常是一种Java Hashmap。 Everything works fine but when I try to register a method of the library object in the constructor I got some compilation error which I cannot understand. 一切正常,但是当我尝试在构造函数中注册库对象的方法时,出现了一些无法理解的编译错误。 I'm using Arduino IDE 1.6.9 with Ubuntu 16.04 LTS 64bit. 我正在将Arduino IDE 1.6.9与Ubuntu 16.04 LTS 64bit一起使用。 The board is an Arduino UNO. 该板是Arduino UNO。 Here below the code, header: 在下面的代码标题下:

#ifndef BlueHartwin_H
#define BlueHartwin_H

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

    #define START_TX 254
    #define STOP_TX 255

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


    class BlueHartwin {

    public:
        BlueHartwin(byte bluetoothTx,byte bluetoothRx,long baudRate);
        ~BlueHartwin();
        boolean registerCmd(byte id,CmdFuncPtr cmdFuncPtr);
        boolean unRegisterCmd(byte id,CmdFuncPtr cmdFuncPtr);
        boolean runCmd(byte id);
        void setDataLength(byte dataLength);
        byte getDataLength();
        byte getIncomingByte();
        void txSwitchOff(void);
        void txSwitchOn(void);
        bool isTx();
        boolean available();
        boolean read();
        void write(byte data,boolean endLine);


    private:

        CmdFuncPtr setOfCmds[255];
        byte mDataLength;
        bool tx;
        byte incomingByte;
    };

    #endif

body: 身体:

#include "BlueHartwin.h";

/*
 * Reserved command IDs:
 * 14,
 * 15
*/


SoftwareSerial bluetooth(7,8);


BlueHartwin::BlueHartwin(byte bluetoothTx,byte bluetoothRx,long baudRate){
    bluetooth = SoftwareSerial(bluetoothTx,bluetoothRx);
    bluetooth.begin(baudRate);
    for (int i=0;i<=255;i++) {
        setOfCmds[i]=NULL;
    }
    tx=false;

    registerCmd(14,&txSwitchOff);
    registerCmd(15,&txSwitchOn);
}

BlueHartwin::~BlueHartwin(){

}

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

boolean BlueHartwin::unRegisterCmd(byte id,CmdFuncPtr cmdFuncPtr){
    setOfCmds[id]=NULL; 
    return true;

}


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


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

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

byte BlueHartwin::getIncomingByte(){
    return incomingByte;
}

boolean BlueHartwin::isTx(){
    return tx;
}

void BlueHartwin::txSwitchOff(void){
  tx=false;
  Serial<<"now tx is "<<tx<<endl;
}

void BlueHartwin::txSwitchOn(void){
  tx=true;
  Serial<<"now tx is "<<tx<<endl;
}

boolean BlueHartwin::available(){
    return bluetooth.available();
}

boolean BlueHartwin::read(){

    if (bluetooth.available()>0)
        {
         incomingByte=bluetooth.read();
         Serial << "Incoming byte " << incomingByte<<endl;
         return runCmd(incomingByte);
        }
    return false;
}


void BlueHartwin::write(byte data,boolean endLine){
    if (tx) {
        if (endLine) bluetooth << data << endl;
        else bluetooth<<data;
    }
}

error: 错误:

/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.cpp: In constructor 'BlueHartwin::BlueHartwin(byte, byte, long int)':
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.cpp:21:18: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function.  Say '&BlueHartwin::txSwitchOff' [-fpermissive]
  registerCmd(14,&txSwitchOff);
                  ^
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.cpp:21:29: error: no matching function for call to 'BlueHartwin::registerCmd(int, void (BlueHartwin::*)())'
  registerCmd(14,&txSwitchOff);
                             ^
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.cpp:21:29: note: candidate is:
In file included from /home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.cpp:1:0:
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.h:19:10: note: boolean BlueHartwin::registerCmd(byte, CmdFuncPtr)
  boolean registerCmd(byte id,CmdFuncPtr cmdFuncPtr);
          ^
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.h:19:10: note:   no known conversion for argument 2 from 'void (BlueHartwin::*)()' to 'CmdFuncPtr {aka void (*)()}'
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.cpp:22:18: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function.  Say '&BlueHartwin::txSwitchOn' [-fpermissive]
  registerCmd(15,&txSwitchOn);
                  ^
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.cpp:22:28: error: no matching function for call to 'BlueHartwin::registerCmd(int, void (BlueHartwin::*)())'
  registerCmd(15,&txSwitchOn);
                            ^
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.cpp:22:28: note: candidate is:
In file included from /home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.cpp:1:0:
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.h:19:10: note: boolean BlueHartwin::registerCmd(byte, CmdFuncPtr)
  boolean registerCmd(byte id,CmdFuncPtr cmdFuncPtr);
          ^
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.h:19:10: note:   no known conversion for argument 2 from 'void (BlueHartwin::*)()' to 'CmdFuncPtr {aka void (*)()}'
exit status 1
Errore durante la compilazione per la scheda Arduino/Genuino Uno.

If I change in the constructor the rows: 如果我在构造函数中更改行:

registerCmd(14,&txSwitchOff);
registerCmd(15,&txSwitchOn);

to

registerCmd(14,&BlueHartwin::txSwitchOff);
registerCmd(15,&BlueHartwin::txSwitchOn);

I got this error: 我收到此错误:

/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.cpp: In constructor 'BlueHartwin::BlueHartwin(byte, byte, long int)':
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.cpp:21:42: error: no matching function for call to 'BlueHartwin::registerCmd(int, void (BlueHartwin::*)())'
  registerCmd(14,&BlueHartwin::txSwitchOff);
                                          ^
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.cpp:21:42: note: candidate is:
In file included from /home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.cpp:1:0:
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.h:19:10: note: boolean BlueHartwin::registerCmd(byte, CmdFuncPtr)
  boolean registerCmd(byte id,CmdFuncPtr cmdFuncPtr);
          ^
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.h:19:10: note:   no known conversion for argument 2 from 'void (BlueHartwin::*)()' to 'CmdFuncPtr {aka void (*)()}'
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.cpp:22:41: error: no matching function for call to 'BlueHartwin::registerCmd(int, void (BlueHartwin::*)())'
  registerCmd(15,&BlueHartwin::txSwitchOn);
                                         ^
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.cpp:22:41: note: candidate is:
In file included from /home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.cpp:1:0:
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.h:19:10: note: boolean BlueHartwin::registerCmd(byte, CmdFuncPtr)
  boolean registerCmd(byte id,CmdFuncPtr cmdFuncPtr);
          ^
/home/paolo/ARDUINO/arduino-1.6.9/libraries/BlueHartwin/BlueHartwin.h:19:10: note:   no known conversion for argument 2 from 'void (BlueHartwin::*)()' to 'CmdFuncPtr {aka void (*)()}'
exit status 1
Errore durante la compilazione per la scheda Arduino/Genuino Uno.

Thanks in advance for help! 在此先感谢您的帮助!

Mate, your txSwitchOn/Off methods are instance ones - they require a this to work fine. 配合,您的txSwitchOn / Off方法是实例方法-它们需要使用this才能正常工作。

On the other side, your CmdFuncPtr is the definition of a function that doesn't depend on anything. 另一方面,您的CmdFuncPtr是不依赖任何内容的函数的定义。


How many such devices (to be supported by your library) is Arduino assumed to handle at any one time? 假定Arduino一次可以处理多少个此类设备(由您的库支持)?

If it's a single one, then declare everything static, rename the constructot to "static void init() and the destructor to "static void disconnect()", etc. You will have the class acting as just a naming context for your functions (all static). 如果是一个,则将所有内容声明为静态,将构造函数重命名为“ static void init(),将析构函数重命名为” static void Disconnect()”,依此类推。您将使该类仅充当函数的命名上下文(全部静态)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM