我在理解为什么我的程序在 esp32 处理器上运行时崩溃并导致它反复重置时遇到了问题。我正在开发 esp32 的 NODEMCU devkit 版本。我正在使用 PlatformIO 并利用 Arduino 代码库的 esp32 版本。
在我的程序中,我正在制作一个调试类来复制 Serial 所做的事情,但通过 UDP 到网络上侦听的任何设备。基本上它所做的就是检查 Serial 是否已连接并将打印语句发送给它。否则它会通过 UDP 发送打印语句。
为此,我从 Stream 类创建了一个类,就像 Serial 一样。这意味着我需要制作将写入调用发送到的函数。所有数据都已转换为 uint8_t 的调用。不过,要将数据发送到串行,我必须将其转换为它接受的类型。实际上,这就是 char 字符最终被传递给 Serial:
的方式Serial.print((const char*)((const uint8_t *) '-'));
现在,这基本上只是转换一个字符。到 uint8_t 的转换是在我得到它之前完成的,我只是将它转换为 Serial 类可以接受的东西。相反,我得到的是我的控制器崩溃、恐慌和重置。现在,是的,我可以通过尝试阻止打印字符来相当容易地改变这一点,但我宁愿了解这里出了什么问题,如果这是内爆,可能还有其他地雷我还没有踩到这个一个已经让我退缩了。
谁能解释为什么转换字符会导致崩溃?
问题是您将
char
、'-'
转换为指针,从 char
值创建地址。这与执行 reinterpret_cast<const char*>('-')
相同,假设 ASCII,它与向 0x2d
函数提供地址 print
相同,该函数然后将从地址 0x2d
开始读取,这不太可能是您程序的有效地址,所以你会有未定义的行为。
如果你有一个
uint8_t something;
然后做
Serial.print(static_cast<char>(something));
这将使用
Serial.print
超载,只需要一个 char
.