在Arduino中自定义标准Serial.print函数



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

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

用myUDPandprintfunction((替换所有Serial.println((应该有点简单,但我有很多错误(草图相当大(,我更喜欢只在一个地方更改代码。

关于最好的方法有什么建议吗?我尝试过的每一件事都遇到了大麻烦,我可以就什么是好方法提出一些建议。我应该回去摆弄HardwareSerial.h吗?

编辑:Arduino IDE似乎在第1行包含了Arduino.h,即使那里什么都没有。这反过来包括标准的HardwareSerial.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

还有一个像这样的.cpp文件:

#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()调用更改为UDPWrapper()。对于可以放入其中的每一种类型,都有单独编写的重载。

更好的建议仍然是受欢迎的,因为我不喜欢制作丑陋的代码

Sopwafel的回答对我不起作用;我有一些编译错误,例如cannot declare variable 'udpSerial' to be of abstract type 'UdpSerial'。(然后它在HardwareSerial类中列出了各种"虚拟方法",即没有实现的方法(

这是我使用的变体。(用于Arduino Nano 33 BLE(

MySerial.h:

#ifndef MySerial_block
#define MySerial_block
#include <Print.h>
class MySerial: public Print {
using Print::Print;   // Inheriting constructors
public: 
size_t write(uint8_t val) override;   // Overriding base functionality
size_t write(const uint8_t *buffer, size_t size) override;   // Overriding base functionality
};
extern MySerial mySerial; // Making it available as `mySerial`
#endif

MySerial.cpp

#include "MySerial.h"
#include "Arduino.h"
MySerial vs;
size_t MySerial::write(uint8_t val) {
Serial.write(buffer, size);
// put your custom logging code here
}
size_t MySerial::write(const uint8_t *buffer, size_t size) {
Serial.write(buffer, size);
// put your custom logging code here
}

然后,无论我在哪里打Serial.print[ln],我现在都打mySerial.print[ln]。(从Print继承是为了不必为各种结构/值类型重新定义所有重载(

最新更新