如何在 esp32 上转换字符会导致崩溃?

问题描述 投票:0回答:1

我在理解为什么我的程序在 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 类可以接受的东西。相反,我得到的是我的控制器崩溃、恐慌和重置。现在,是的,我可以通过尝试阻止打印字符来相当容易地改变这一点,但我宁愿了解这里出了什么问题,如果这是内爆,可能还有其他地雷我还没有踩到这个一个已经让我退缩了。

谁能解释为什么转换字符会导致崩溃?

c++ arduino microcontroller esp32 platformio
1个回答
0
投票

问题是您将

char
'-'
转换为指针,从
char
值创建地址。这与执行
reinterpret_cast<const char*>('-')
相同,假设 ASCII,它与向
0x2d
函数提供地址
print
相同,该函数然后将从地址
0x2d
开始读取,这不太可能是您程序的有效地址,所以你会有未定义的行为。

如果你有一个

uint8_t something;
然后做

Serial.print(static_cast<char>(something));

这将使用

Serial.print
超载,只需要一个
char
.

© www.soinside.com 2019 - 2024. All rights reserved.