【发布时间】:2021-11-01 22:16:38
【问题描述】:
我正在创建一个函数来处理消息,然后使用 Serial.println() 打印消息。我有它的工作,但遇到了一个我无法解释的问题。下面的第一个示例代码有效,第二个(交换我的函数声明的顺序)将编译和加载,但会导致 Teensy 4.1 崩溃。我在 VSCode 上使用 PlatformIO。
谁能告诉我第二个代码有什么问题,为什么它会编译没有错误,但不能运行?
这行得通:
#include <Arduino.h>
void LogMsg(const char *msg){
Serial.println(msg);
}
void LogMsg(String s){ LogMsg(s.c_str()); }
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("reset");
}
void loop() {
// put your main code here, to run repeatedly:
String str3 = "testing string cat ";
uint32_t var = 12345;
LogMsg(str3 + var);
delay(500);
}
这会编译、加载,但会崩溃,导致连续重置:
#include <Arduino.h>
void LogMsg(String s){ LogMsg(s.c_str()); } // <-- swapped order
void LogMsg(const char *msg){ // <-- swapped order
Serial.println(msg);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("reset");
}
void loop() {
// put your main code here, to run repeatedly:
String str3 = "testing string cat ";
uint32_t var = 12345;
LogMsg(str3 + var);
delay(500);
}
编辑:void LogMsg(String s) 的定义已更改以反映原始错误和@hcheung 建议的简化。行为保持不变。第一个实例有效,第二个崩溃。
【问题讨论】:
-
其实不需要两个函数,可以用
LogMsg(String.c_str());调用LogMsg()。或者如果你真的需要两个重载函数,使用void LogMsg(String s) { LogMsg(s.c_str(); }会更简单,错误更少。 -
顺便说一句,它崩溃的原因是因为您为
buf[n]分配的内存小于您尝试复制到的 String 对象。 -
@hcheung - 感谢您的简化。但是,随着您的更改,问题仍然存在。第一次定义
void LogMsg(String s){ LogMsg(s.c_str()); }时,程序崩溃,第二次定义时,它可以工作。有什么想法吗? -
嗯,这似乎与platformIO有关,它不会崩溃并在Arduino IDE上正确执行,但当我在platformIO(使用Atom)上运行它时无法正常工作。我不知道原因,但是您可以通过将函数更改为
LogMsg(String s) { Serial.println(s.c_str()); }使其正常运行(即不调用其他重载函数)。 -
@Juraj,
String.toCharArray()有经典的“short-by-1”问题,如果是n = String.length(),则需要传入n+1才能得到完整的字符串@987654331 @,否则会缩短一个字符,也就是说buf必须是char buf[n+2]。
标签: arduino platformio teensy