打印硬件的名称

print name of HardwareSerial type

本文关键字:硬件 打印      更新时间:2023-10-16

我正在迭代硬件串行端口,我想打印一些关于哪个端口当前正在使用的状态信息。如何打印硬件串行类型的名称?一些示例代码:

HardwareSerial *possible_ports[] = {&Serial2, &Serial3};
int port_count = 2;
for (int i=0; i<port_count; i++) {
    Serial.print("using: ");
    Serial.println(*possible_ports[i]);
}

编译错误:

"no known conversion for argument 1 from 'HardwareSerial' to 'const Printable&'"

好吧,正如编译器告诉你的那样,你不能打印HardwareSerial,因为它没有意义。

然而,你没有采取正确的方法来解决你的问题,因为这是一个折叠问题:

  • 根据硬件的不同,您可能有不同数量的串行端口;
  • 在设置中设置或不设置串口。

对于第一点,你能做的不多,一切都是在编译时设置的,这就是你必须实现的:不同的用例取决于不同的AVR。

HardwareSerial *possible_ports[] = {
#if defined(UBRRH) || defined(UBRR0H)
&Serial,
#endif
#if defined(UBBR1H)
&Serial1, 
#endif
#if defined(UBBR2H)
&Serial2,
#endif
#if defined(UBBR3H)
&Serial3
#endif
};

对于第二点,我不认为在HardwareSerial类中有什么要测试的,尽管你可以自己做:

bool serial_is_configured() {
    return (_BV(TXEN0) & UCSRB == _BV(TXEN0));
} 
bool serial1_is_configured() {
    return (_BV(TXEN1) & UCSRB == _BV(TXEN1));
} 
// ...

cf源码:

  • 第487行
  • 第406行
在:

  • cbi()清除位
  • sbi()设置位

HTH