Arduino:将函数传递给类,返回String

时间:2017-05-17 09:44:45

标签: c++ string arduino

我试图让我的Arduino类返回包含所有日志信息的String消息。经过大量的试验和错误,我设法将日志函数的引用传递给类,但是只能获取char *而不是String,我希望能够发送字符串使得它更容易发回所有各种数据。

我已经完成了第一部分工作。 草图:

#include <Test.h>
#include <string.h>

void setup() {
  Serial.begin(115200);
  Test t;
  t.setLogging(writeLog);
  writeLog("Test message!" + String(" .... "));
  t.doSomething("This is useful.");
  t.doSomething("This as well.\n");
  t.doSomething("This is even more useful.\n");
  bool b = true;

}

void loop() {
}

void writeLog (char* message) {
  Serial.print("char function: ");
  Serial.print(message);
}

void writeLog (String message) {
  Serial.print("String function: ");
  Serial.println(message);
}

标题文件:

#ifndef TEST_h
#define TEST_h

class Test
{
  public:
    Test();       // The constructor.
    void setLogging(void (*)(char*)); // Takes function setting where to log.
    void doSomething(char*);
};

#endif

班级:

#include <Test.h>

typedef void (*LogFunction)(char*);
LogFunction writeLog;

Test::Test () { 
}

void Test::doSomething (char* s) {

  // Do something useful and log the result.
  writeLog(s);
}

void Test::setLogging (void (*f)(char*) ) {
  writeLog = f;
  return;
}

现在我希望我的班级能够做的是发送这样的信息,如String,而不是char *(我也没有找到一种简单的方法来转换&#34;任何东西&#34;到char *然后连接两个或多个字符串):

writeLog ("HydroMonitorECSensor::setCalibration  Receiving calibration - haveCalibration = " + String(haveCalibration));
writeLog ("HydroMonitorECSensor::setCalibration  calibratedSlope = " + String(calibratedSlope));
writeLog ("HydroMonitorECSensor::setPins  capPos set to " + String(capPos));

其中haveCalibrationbool(其中字符串变为&#34; true&#34;或&#34; false&#34;),calibratedSlope是{{} 1}}和doublecapPos。通过这种方式,我可以轻松,干净地将完整的行发送到记录器。在主要脚本中工作得很好 - 而不是在课堂上。

我尝试将int更改为char*并将String添加到库文件中,但它无法正常工作。

在Test.cpp中我得到#include <string.h>并在Test.h void Test::setLogging (void (*f)(String) ) {中,现在我收到错误消息:

void setLogging(void (*)(String));

建议?

其他信息,也许很重要:我使用Arduino IDE并编译ESP8266。

2 个答案:

答案 0 :(得分:2)

您正在使用Arduino提供的String类,但未在Arduino.h头文件中包含test.h标头。这导致它找不到String类,编译失败。

以下作品:

main.cpp

#include <Arduino.h>
#include <test.hpp>

void writeLog (char* message);
void writeLog (String message);

void setup() {
  Serial.begin(115200);
  Test t;
  t.setLogging(writeLog);
  writeLog("Test message!" + String(" .... "));
  t.doSomething("This is useful.");
  t.doSomething("This as well.\n");
  t.doSomething("This is even more useful.\n");
  bool b = true;

}

void loop() {
}

void writeLog (char* message) {
  Serial.print("char function: ");
  Serial.print(message);
}

void writeLog (String message) {
  Serial.print("String function: ");
  Serial.println(message);
}

test.hpp

#ifndef TEST_h
#define TEST_h

#include <Arduino.h> //for "String" class

//Typdef for the log function. Takes a String, returns nothing
typedef void (*LogFunction)(String);

class Test
{
  public:
    Test();       // The constructor.
  //  void setLogging(void (*)(char*)); // Takes function setting where to log.
    void setLogging(LogFunction); //use the typedef here
    void doSomething(char*);
};

#endif

test.cpp

#include <test.hpp>


LogFunction writeLog;

Test::Test () {
}

void Test::doSomething (char* s) {

  // Do something useful and log the result.
  writeLog(s);
}

//void Test::setLogging (void (*f)(char*) ) {
void Test::setLogging (LogFunction f) { //also use typedef here
  writeLog = f;
  return;
}

答案 1 :(得分:0)

在可能出现的其他情况中,编译器会告诉您它无法解析标识符String。 这可能有以下几个原因:首先,您要写String,而不是string(请注意您写作中的大写字母)。其次,如果你写string而不是std::string,除非你声明using namespace std(由于多种原因不是首选版本)或using std::string,否则无法解决。第三,课程std::string在标题<string>中声明,与<string.h>不同。

所以我写#include <string>然后使用std::string