我正在尝试修改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 以便于编程)
答案 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)
有一些可能性:
在通过指针
您可以将相应的方法添加到Stream类并使其成为虚拟
虚拟开始(长x){}
以便编译器停止抱怨并为对象使用正确的方法。
您可以创建多个构造函数(可能是最佳解决方案):
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;静态演员