esp32 ram碎片处理字符串



我过去在使用String对象时遇到过RAM碎片问题,所以我进行了一些测试,并改用ArduinoJson库。

我发现我的程序使用ArduinoJson是稳定的,但是我的代码更长。因此,我想回到使用String,并通过连接String变量来编写answer函数。

以下哪种方法是避免RAM碎片的最佳方法?

方法一:

void server answer (){
request->send(200, "application/json", "{'data': "+variable+"});
}

方法二:

String Answer;

void server answer (){
Answer = "{ 'data':" + variable + "}"
request->send(200, "application/json", Answer);
}

方法二之二:

void server answer (){
String Answer;
Answer = "{ 'data':" + variable + "}"
request->send(200, "application/json", Answer);
}

方法三:

String cretateAnswer(){
return "{ 'data': + variable + "};
}
void server answer (){
request->send(200, "application/json", cretateAnswer());
}

我知道什么是ram碎片,但我真的不明白这是什么时候发生的,为什么使用String,以及如果我的库想要一个String作为答案,我如何避免它????

附言:我写了这个问题";在飞行中";因此,如果json语法错误或'之前的\,对不起。

它们都是一样的。它们都在执行完全相同的内存分配来连接字符串。

要么在堆栈上使用缓冲区,要么使用sprintf构建字符串

char buff[32];
snprintf(buff, sizeof(buff), "{ "data":%d}", variable);
request->send(200, "application/json", buff);

或者根本不连接,只需立即发送每个部分。

AsyncResponseStream *response = request->beginResponseStream("application/json");
response->print("{ "data":");
response->print(variable);
response->print("}");
request->send(response);

或者只是

AsyncResponseStream *response = request->beginResponseStream("application/json");
response->printf("{ "data":%d}", variable);
request->send(response);

最新更新