Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Arduino中自定义标准串行打印功能_C++_Arduino_Libraries - Fatal编程技术网

C++ 在Arduino中自定义标准串行打印功能

C++ 在Arduino中自定义标准串行打印功能,c++,arduino,libraries,C++,Arduino,Libraries,我需要测试一组arduino装置,并希望更改标准的硬件序列,以便它也将打印的内容发送到我的UDP服务器。与UDP服务器的通信工作正常,没有问题 我曾考虑将HardwareSerial库复制到我的projects/src文件夹中,但它似乎忽略了它,并包含了标准库,即使在使用#include“src/HardwareSerial/HardwareSerial.h”时也是如此。里面的东西也不会被执行 用myUDPandprintfunction()替换所有Serial.println()应该有点简单,

我需要测试一组arduino装置,并希望更改标准的硬件序列,以便它也将打印的内容发送到我的UDP服务器。与UDP服务器的通信工作正常,没有问题

我曾考虑将HardwareSerial库复制到我的projects/src文件夹中,但它似乎忽略了它,并包含了标准库,即使在使用
#include“src/HardwareSerial/HardwareSerial.h”
时也是如此。里面的东西也不会被执行

用myUDPandprintfunction()替换所有Serial.println()应该有点简单,但我遇到了大量错误(草图相当大),我更愿意在一个地方更改代码

有没有关于最好的方法的建议?我尝试过的每一件事都遇到了大麻烦,我可以就什么是好方法提出一些建议。我是不是应该继续玩弄硬武器审判

编辑: 看起来ArduinoIDE在第1行包含了Arduino.h,即使那里什么都没有。而这又包括了标准的硬件试验。很不方便

此外,我希望将自定义库文件放在我的项目文件夹中,以便与Git同步。

编辑:
找到了正确的方法。我编写了一个头文件,如下所示:

#ifndef UdpSerial_h
#define UdpSerial_h

#include <HardwareSerial.h>
#include "Arduino.h"

class UdpSerial: public HardwareSerial{
    using HardwareSerial::HardwareSerial;   // Inheriting constructors
    public: 
    size_t write(const uint8_t *buffer, size_t size) override;   // Overriding base functionality
};

extern UdpSerial udpSerial; // Making it available as udpSerial
#endif
#include "udpSerial.h"

#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL)
UdpSerial udpSerial(0);
#endif

size_t UdpSerial::write(const uint8_t *buffer, size_t size){
    myExtraFunctionality();
    Print::write(buffer, size);
}
非常感谢@Delta_G为我指明了正确的方向

原创帖子:

现在,我放弃了,只编写一个包装器函数,将打印到串行和UDP。然后将我项目中的~100个
Serial.println()
调用更改为
udpwraper()
。对于可以放入其中的每种类型,都有单独编写的重载

仍然欢迎提出更好的建议,因为我不喜欢编写难看的代码编辑:
找到了正确的方法。我编写了一个头文件,如下所示:

#ifndef UdpSerial_h
#define UdpSerial_h

#include <HardwareSerial.h>
#include "Arduino.h"

class UdpSerial: public HardwareSerial{
    using HardwareSerial::HardwareSerial;   // Inheriting constructors
    public: 
    size_t write(const uint8_t *buffer, size_t size) override;   // Overriding base functionality
};

extern UdpSerial udpSerial; // Making it available as udpSerial
#endif
#include "udpSerial.h"

#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL)
UdpSerial udpSerial(0);
#endif

size_t UdpSerial::write(const uint8_t *buffer, size_t size){
    myExtraFunctionality();
    Print::write(buffer, size);
}
非常感谢@Delta_G为我指明了正确的方向

原创帖子:

现在,我放弃了,只编写一个包装器函数,将打印到串行和UDP。然后将我项目中的~100个
Serial.println()
调用更改为
udpwraper()
。对于可以放入其中的每种类型,都有单独编写的重载


更好的建议仍然是受欢迎的,因为如果您包含Arduino,我不喜欢生成难看的代码。

建设者不会添加它。是的,但我会手动添加它,因此仍然会出现冲突。听起来您需要一些“猴子补丁”方法。自从我看到这个问题以来,我一直在断断续续地寻找解决方案,但没有发现任何有希望的东西。如果您包括Arduino.h,则生成器不会添加它。是的,但我正在手动添加它,因此仍然会遇到冲突。听起来您需要某种“猴子修补”方法。自从看到这个问题以来,我一直在断断续续地寻找解决方案,但没有找到任何有希望的方法。如果从Print类继承它,只需在包装器中实现
write(byte)
。所有其他打印功能都使用write(字节)在打印中实现。为了避免编写一大堆单独的重载,请查看模板函数。与其重写HardwareSerial,不如编写一个继承自它的类,然后将包装器函数模板添加到该类中。@Delta_G aha,然后我会使用类似于
Serial.myUpdPrint(str)的东西,其中myUdpPrint()执行我希望它在调用base.write()之前执行的额外操作?我应该花上几天时间来真正学习C++如何处理类、继承、头文件(那些是如此混乱)和东西。一旦我有时间。是的,但你不会叫它连续剧。这是一个硬武器审判的例子。您将使用为类创建的实例。但你会用和连续剧一样的方式创作它。这是我的第二个猜测。一旦我的答案生效,我会更新它。谢谢!如果从Print类继承包装器,则只需在包装器中实现
write(byte)
。所有其他打印功能都使用write(字节)在打印中实现。为了避免编写一大堆单独的重载,请查看模板函数。与其重写HardwareSerial,不如编写一个继承自它的类,然后将包装器函数模板添加到该类中。@Delta_G aha,然后我会使用类似于
Serial.myUpdPrint(str)的东西,其中myUdpPrint()执行我希望它在调用base.write()之前执行的额外操作?我应该花上几天时间来真正学习C++如何处理类、继承、头文件(那些是如此混乱)和东西。一旦我有时间。是的,但你不会叫它连续剧。这是一个硬武器审判的例子。您将使用为类创建的实例。但你会用和连续剧一样的方式创作它。这是我的第二个猜测。一旦我的答案生效,我会更新它。谢谢!