[英]esp32 ram fragmentation handling string
过去我在使用 String object 时遇到过 RAM 碎片问题,所以我进行了一些测试并切换到使用 ArduinoJson 库。
我发现我的程序在使用 ArduinoJson 时很稳定,但是我的代码更长。 因此,我想 go 回到使用 String 并通过连接 String 变量来写我的answer
function。
以下哪种方法最能避免 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());
}
我知道什么是内存碎片,但我真的不明白这是什么时候发生的,为什么要使用字符串,如果我的库想要一个字符串作为答案,我该如何避免它????
PS我“即时”写了这个问题,所以如果json语法错误或'之前的\,对不起。
他们都是一样的。 他们都在做完全相同的 memory 分配来连接字符串。
您可以在堆栈上使用缓冲区,然后使用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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.