2017-05-27 63 views
0

我正在嘗試爲打印類打印數據的重定向庫。我不幸被困在錯誤讀取Arduino:重寫打印類問題

error: cannot declare variable 'diagData' to be of abstract type 'PrintToString'

note: because the following virtual functions are pure within 'PrintToString'

note: virtual size_t PrintToString::write(uint8_t)

我想如何實現這一點,但沒有運氣幾個變化。 (從互聯網來源)


鏈接

打印類:github.com/ Print.hPrint.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(); 
} 
+2

你可以上傳你的Arduino Sketch嗎?順便說一句,你對'String * data'的內存管理有嚴重的錯誤。您應該首先刪除'data',並在'〜PrintToString()'中將其設置爲空。在clear()中獲得一個新字符串之前,你應該首先'刪除'。否則,這個類會在幾分鐘內讓您的Arduino崩潰。 –

+0

感謝您提供內存管理建議我非常喜歡它。草圖很短,所以我已經包括它來回答。 – PSSGCSim

回答

1

這是因爲這個類有一個pure virtual function這裏:

size_t write(uint8_t) = 0;

具有純虛函數的類不能實例化。所以方法write(uint8_t)必須以某種方式在你的代碼中實現。

編輯:考慮利用您在sendStringPacket()中使用的代碼write(uint8_t)。您可以在不使用sendStringPacket(diagData.result());語句的情況下重定向輸出。