2017-03-11 78 views
0

部首代碼重載方法

/* 
* MngCommunication.h 
* 
* Created on: 26 gen 2017 
*  Author: Giuliano 
*/ 

#ifndef _MNGCOMMUNICATION_H_ 
#define _MNGCOMMUNICATION_H_ 

// ------------------------- N.B. MngCommunication is a Singleton  class!!! ---------------------------- 
#if (ARDUINO < 100) 
#include <WProgram.h> 
#else 
#include <Arduino.h> 
#endif 

class MngCommunication 
{ 
public: 
    static MngCommunication* getInstance(); 


    size_t LogLine(const __FlashStringHelper *ifsh, boolean end=false); 
    size_t LogLine(const String &str, boolean end=false); 
    size_t LogLine(const char str[], boolean end=false); 
    size_t LogLine(const unsigned char n, boolean end=false); 
    size_t LogLine(const int n, boolean end=false); 
    size_t LogLine(const unsigned int n, boolean end=false); 
    size_t LogLine(const long n, boolean end=false); 
    size_t LogLine(const unsigned long n, boolean end=false); 
    size_t LogLine(const double n, boolean end=false); 
    size_t LogLine(const Printable&str, boolean end=false); 

protected: 
    static MngCommunication* _inst_; 
    MngCommunication(); 
}; 

#endif /* MNGCOMMUNICATION_MNGCOMMUNICATION_H_ */ 

C++代碼

/* 
* MngCommunication.cpp 
* 
* Created on: 26 gen 2017 
*  Author: Giuliano 
*/ 

#include <string.h> 
#include "MngCommunication.h" 


MngCommunication* MngCommunication::_inst_ = NULL; 


MngCommunication::MngCommunication() 
{ 
    Serial.begin(57600); 

} 


MngCommunication* MngCommunication::getInstance() 
{ 
    if (_inst_ == NULL) _inst_ = new MngCommunication; 

    return _inst_; 
} 

//-------------------------------------------------------------------- 
//-------------------------------------------------------------------- 
// ------------------------ LOGGING FUNCTION ------------------------- 
//-------------------------------------------------------------------- 
//-------------------------------------------------------------------- 
boolean started=false; 

inline size_t startLine(void) 
{ 
    static char timebuffer[8]; 
    size_t sz = 0; 

    sprintf(timebuffer,"%08lu", millis()); 

    sz += Serial.print("#L-"); 
    sz += Serial.print(timebuffer); 
    sz += Serial.print("-"); 
    started=true; 
    return sz; 

} 

inline size_t endline(void) 
{ 
    started = false; 
    return Serial.write("\r\n"); 
} 

size_t MngCommunication::LogLine(const __FlashStringHelper *ifsh, boolean end) 
{ 
    size_t sz=0; 
    if (!started) 
    { 
    sz += startLine(); 
    started = true; 
    } 

    sz += Serial.print(ifsh); 

    if (end) 
    { 
     sz += endline(); 
    } 


    return sz; 
} 

size_t MngCommunication::LogLine(const String &str, boolean end) 
{ 
    size_t sz=0; 
    if (!started) 
    { 
     sz += startLine(); 
     started = true; 
    } 

    sz += Serial.print(str); 

    if (end) 
    { 
     sz += endline(); 
    } 

    return sz; 
} 


size_t MngCommunication::LogLine(const char str[], boolean end) 
{ 
    size_t sz=0; 
    if (!started) 
    { 
     sz += startLine(); 
     started = true; 
    } 

    sz += Serial.print(str); 

    if (end) 
    { 
     sz += endline(); 
    } 

    return sz; 
} 





size_t MngCommunication::LogLine(const unsigned char n, boolean end) 
{ 
    return LogLine((unsigned long) n, end); 
} 


size_t MngCommunication::LogLine(const int n, boolean end) 
{ 
    return LogLine((long) n, end); 
} 

size_t MngCommunication::LogLine(const unsigned int n, boolean end) 
{ 
    return LogLine((unsigned long) n, end); 
} 


size_t MngCommunication::LogLine(const long n, boolean end) 
{ 
    size_t sz=0; 
    if (!started) 
    { 
     sz += startLine(); 
     started = true; 
    } 

    sz += Serial.print(n); 

    if (end) 
    { 
     sz += endline(); 
    } 

    return sz; 
} 

size_t MngCommunication::LogLine(const unsigned long n, boolean end) 
{ 
    size_t sz=0; 
    if (!started) 
    { 
     sz += startLine(); 
     started = true; 
    } 

    sz += Serial.print(n); 

    if (end) 
    { 
     sz += endline(); 
    } 

    return sz; 
} 



size_t MngCommunication::LogLine(const double n, boolean end) 
{ 
    size_t sz=0; 
    if (!started) 
    { 
     sz += startLine(); 
     started = true; 
    } 

    sz += Serial.print(n); 

    if (end) 
    { 
     sz += endline(); 
    } 

    return sz; 
} 

size_t MngCommunication::LogLine(const Printable&str, boolean end) 
{ 
    size_t sz=0; 
    if (!started) 
    { 
     sz += startLine(); 
     started = true; 
    } 

    sz += Serial.print(str); 

    if (end) 
    { 
     sz += endline(); 
    } 

    return sz; 
} 

如果我使用​​函數字符串或字符緩衝器中,所有正常。例如: -

MngCommunication* Comm; 

Comm = MngCommunication::getInstance(); 
Comm.LogLine("this "); 
Comm.LogLine("is "); 
Comm.LogLine("a "); 
Comm.LogLine("test!!! ", true); 

奇怪的是號碼的呼叫: 如果我叫​​與數量例如爲:

MngCommunication* Comm; 

Comm = MngCommunication::getInstance(); 
Comm.LogLine(millis()); 

代碼執行就可以了。但第二個電話號碼或字符串,重新啓動Arduino。同樣,如果我先用字符串然後用數字調用函數。例如: -

所有這些緩衝區的
MngCommunication* Comm; 

Comm = MngCommunication::getInstance(); 
Comm.LogLine("this "); 
Comm.LogLine("is "); 
Comm.LogLine("a "); 
Comm.LogLine("test!!! "); 

Comm.LogLine("time= "); 
Comm.LogLine(mills()); 
+2

解決這些問題的正確工具是你的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+1

這是否發生在**所有不同的重載'數'函數(即double,long,int等)? – Archimaredes

+1

@πάνταῥεῖ Arduino沒有逐行調試器... 我在其他平臺,交叉編譯器或機器編譯器上工作,在那些情況下,我通常使用逐行調試器。但在Arduino上我不行。 – EffegiWeb

回答

1
static char timebuffer[8]; 
sprintf(timebuffer,"%08lu", millis()); 

首先是太小了。字符串終結符必須有空格(零字節),所以你有一個緩衝區溢出可能會導致各種奇怪的效果。

該緩衝區長度至少應爲11個字節。最大數量(32位)爲10個字節,字符串終止符爲1個字節。

我認爲mills()是一個錯字?

使用固定值時,您是否有同樣的問題,如Comm.LogLine(123);

如果你叫什麼:

Comm.LogLine(123, true); 
Comm.LogLine(456); 
+0

是的,我會與恆定的價值相同的效果。 'millis()'是一個Arduino函數,它返回板啓動以來的長(無符號32位)毫秒。 – EffegiWeb

+0

勝者是...... 'static char timebuffer [9]' snort !!我不明白爲什麼只有當我使用的數字,也不是字符串。我想通過'Serial.print()'進行不同的管理。我今天很累! – EffegiWeb

+1

很難預測緩衝區溢出會發生什麼(大多數是你最不期待的奇怪的事情)。好好休息! :)''millis()'是的,但你在例子中調用'mills()'。 –