Arduino:在Stream对象

时间:2018-01-20 08:12:55

标签: c++ inheritance arduino

我正在尝试修改this class,以便我可以同时使用 SoftwareSerial HardwareSerial 对象。因此,我添加了一个构造函数,它接受一个 Stream 对象,它是Software和HardwareSerial的超类:

/**
 * Instantiates an SBUS object
 * @param Stream* A HardwareSerial or SoftwareSerial object pointer
 */
SBUS::SBUS(const Stream *serialPort){
    port = serialPort;
}

不幸的是,在SBUS::begin()方法中我必须调用port->begin(BAUDRATE),尽管begin()作为两个子类中的方法存在,因为它不在 Stream 超类,我不能称之为。

如何拨打port->begin()?我试图在SBUS构造和begin()方法之间从外部调用硬件或SoftwareSerial对象上的SBUS::begin(),但这似乎没有正确初始化 SBUS 对象。有没有办法从 SBUS 类中调用begin()

我非常感谢任何帮助。 ( FUTABA_SBUS 已更改为 SBUS 以便于编程)

2 个答案:

答案 0 :(得分:2)

static_cast,因为要进行dynamic_cast,必须启用RTTI

bool hwSerial;
Stream * port;
SBUS::SBUS(SoftwareSerial * serial)    {hwserial = false; port = serial;}
SBUS::SBUS(HardwareSerial * serial)          {swserial = true;  port = serial;}

Then you can do something like this: 
SBUS::portBegin(long baudrate) {
if(hwserial) {
  static_cast<HardwareSerial*>(port)->begin(baudrate);
} else {
  static_cast<SoftwareSerial*>(port)->begin(baudrate);
}

答案 1 :(得分:0)

有一些可能性:

  • 在通过指针

  • 传递之前初始化Serial
  • 您可以将相应的方法添加到Stream类并使其成为虚拟

    虚拟开始(长x){}

以便编译器停止抱怨并为对象使用正确的方法。

  • Pass a pointer到构造函数的正确begin(..)方法,保存并随时调用
  • 您可以创建多个构造函数(可能是最佳解决方案):

    bool hwSerial; Stream * port; SBUS::SBUS(SoftwareSerial * serial) {hwserial = false; port = serial;} SBUS::SBUS(HWSerial * serial) {swserial = true; port = serial;}

    然后你可以这样做: SBUS::portBegin(long baudrate) { if(hwserial) { static_cast<HWSerial*>(port)->begin(baudrate); } else { static_cast<SoftwareSerial*>(port)->begin(baudrate); } - 编辑 - 已更正,动态 - &gt;静态演员