我试图让我的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));
其中haveCalibration
是bool
(其中字符串变为&#34; true&#34;或&#34; false&#34;),calibratedSlope
是{{} 1}}和double
是capPos
。通过这种方式,我可以轻松,干净地将完整的行发送到记录器。在主要脚本中工作得很好 - 而不是在课堂上。
我尝试将int
更改为char*
并将String
添加到库文件中,但它无法正常工作。
在Test.cpp中我得到#include <string.h>
并在Test.h void Test::setLogging (void (*f)(String) ) {
中,现在我收到错误消息:
void setLogging(void (*)(String));
建议?
其他信息,也许很重要:我使用Arduino IDE并编译ESP8266。
答案 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
。