Arduino: основные проблемы класса Print

Я пытаюсь создать библиотеку для перенаправления данных, напечатанных в класс Print. Я, к сожалению, застрял на ошибке, которая читает

ошибка: невозможно объявить переменную diagData абстрактного типа PrintToString

примечание: потому что следующие виртуальные функции являются чистыми внутри ‘PrintToString’

примечание: виртуальный size_t PrintToString :: write (uint8_t)

Я попробовал несколько вариантов, как это реализовать, но безуспешно. (Источник из интернета)


связи

Класс печати: github.com/ Print.h а также Print.cpp

Мой код

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

PrintToString.cpp

#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;
}

TestSketch.ino (я исключил содержимое всех констант)

#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();
}

0

Решение

Это потому, что этот класс имеет чисто виртуальная функция Вот:

size_t write (uint8_t) = 0;

Класс с чисто виртуальной функцией не может быть создан. Итак, метод write(uint8_t) должен быть как-то реализован в вашем коде.

РЕДАКТИРОВАТЬ: рассмотреть возможность использования кода, который вы использовали в sendStringPacket() за write(uint8_t), Вы можете перенаправить вывод без использования sendStringPacket(diagData.result()); заявление.

1

Другие решения

Других решений пока нет …