我需要测试一堆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
继承是为了不必为各种结构/值类型重新定义所有重载(