簡體   English   中英

esp32 ram 碎片處理字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM