C++ Arduino:覆盖打印类问题
我试图创建一个库,用于重定向打印到打印类的数据。不幸的是,我被错误缠住了 错误:无法将变量“diagData”声明为抽象类型“PrintToString” 注意:因为以下虚拟函数在“PrintToString”中是纯函数 注意:虚拟大小\u t打印字符串::写入(uint8\u t) 我尝试了几种不同的实现方法,但没有成功。(来源于互联网)C++ Arduino:覆盖打印类问题,c++,arduino,nodemcu,arduino-esp8266,C++,Arduino,Nodemcu,Arduino Esp8266,我试图创建一个库,用于重定向打印到打印类的数据。不幸的是,我被错误缠住了 错误:无法将变量“diagData”声明为抽象类型“PrintToString” 注意:因为以下虚拟函数在“PrintToString”中是纯函数 注意:虚拟大小\u t打印字符串::写入(uint8\u t) 我尝试了几种不同的实现方法,但没有成功。(来源于互联网) 链接 打印类:github.com/和 我的代码 PrintToString.h #ifndef PRINT_TO_STRING_H #defi
链接 打印类:github.com/和 我的代码 PrintToString.h
#ifndef PRINT_TO_STRING_H
#define PRINT_TO_STRING_H
#include <Arduino.h>
class PrintToString : public Print
{
private:
String* data;
public:
PrintToString();
~PrintToString();
String* results();
void clear();
size_t write(uint8_t) = 0;
size_t write(const uint8_t* buffer, size_t size);
};
#endif
TestSketch.ino(我省略了所有常量的内容)
#包括
#包括
常量字符*WIFI\u SSID
const char*WIFI_通行证
常量字符*API_主机
const uint16\u t API\u端口
const uint16\u t本地\u UDP\u端口
WiFiUDP-UDPClint;
打印字符串诊断数据;
uint64_t包装编号=0;
无效设置()
{
WiFi.begin(WiFi\u SSID、WiFi\u PASS);
UDPClint.begin(本地_UDP_端口);
while(WiFi.status()!=WL_已连接)
延迟(500);
WiFi.printDiag(diagData);
sendStringPacket(diagData.result());
diagData.clear();
}
void循环()
{
延迟(1000);
}
void sendStringPacket(字符串有效负载)
{
UDPClint.beginPacket(API_主机、API_端口);
uint64_t thisPNumber=包装编号++;
字符串thisPNumberStr;
而(此编号>0)
{
uint8_t digit=此编号%10;
此编号为concat(数字);
该编号/=10;
}
UDPClint.write(“;”);
对于(uint64_t i=0;i
这是因为该类在此处有:
写入的大小(uint8\u t)=0
无法实例化具有纯虚函数的类。所以方法write(uint8\t)
必须以某种方式在代码中实现
<>编辑:考虑使用<代码> > StestRistCopyTe]()/<代码> >代码>写入(UIT88T)< /代码>。您可以在不使用sendStringPacket(diagData.result())的情况下重定向输出代码>声明。您也可以上传您的Arduino草图吗?顺便说一下,您在
String*数据的内存管理方面犯了严重错误。您应该首先删除数据
,并在~PrintToString()
中将其设为空。另外,在clear()
中获取新字符串之前,您应该先删除
。否则这门课会在几分钟内让你的Arduino崩溃。谢谢你的内存管理建议,我是一个初学者。这张草图很短,所以我把它包括进来回答。
#include "PrintToString.h"
PrintToString::PrintToString()
{
data = new String();
}
PrintToString::~PrintToString()
{
delete data;
data = NULL;
}
String* PrintToString::results()
{
return data;
}
void PrintToString::clear()
{
delete data;
data = new String();
}
size_t PrintToString::write(const uint8_t* buffer, size_t size)
{
size_t n = 0;
while (size--)
{
if (data->concat(*buffer++))
n++;
else
break;
}
return n;
}
#include <ESP8266WiFi.h>
#include <PrintToString.h>
const char* WIFI_SSID
const char* WIFI_PASS
const char* API_HOST
const uint16_t API_PORT
const uint16_t LOCAL_UDP_PORT
WiFiUDP UDPClint;
PrintToString diagData;
uint64_t packetNumber = 0;
void setup()
{
WiFi.begin(WIFI_SSID, WIFI_PASS);
UDPClint.begin(LOCAL_UDP_PORT);
while (WiFi.status() != WL_CONNECTED)
delay(500);
WiFi.printDiag(diagData);
sendStringPacket(diagData.result());
diagData.clear();
}
void loop()
{
delay(1000);
}
void sendStringPacket(String payload)
{
UDPClint.beginPacket(API_HOST, API_PORT);
uint64_t thisPNumber = packetNumber++;
String thisPNumberStr;
while (thisPNumber > 0)
{
uint8_t digit = thisPNumber % 10;
thisPNumberStr.concat(digit);
thisPNumber /= 10;
}
UDPClint.write(';');
for (uint64_t i = 0; i < payload.length(); i++)
UDPClint.write(payload.charAt(i));
UDPClint.endPacket();
}