部首代碼重載方法
/*
* 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());
解決這些問題的正確工具是你的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –
這是否發生在**所有不同的重載'數'函數(即double,long,int等)? – Archimaredes
@πάνταῥεῖ Arduino沒有逐行調試器... 我在其他平臺,交叉編譯器或機器編譯器上工作,在那些情況下,我通常使用逐行調試器。但在Arduino上我不行。 – EffegiWeb