ESP8266 Не удается добавить символ в очень длинную строку (>8000 символов)

После правильного получения полезной нагрузки из запроса HTTPS добавление символов клиента в строку останавливается примерно через 8000 символов, затем возобновляется и снова останавливается несколько раз. Вот фрагмент моего кода:

long streamSize = 0;
Serial.println("Now reading payload...");
while (stream.connected()) {
    while (stream.available() > 0) {
        char ch = (char)stream.read();
        Serial.println((String)"Reading [" + ++streamSize + "] " + ch);
        ret += ch;
        Serial.println(ret.length());
    }
}

Который отлично работает, пока:

Reading [8685] t
8685
Reading [8686] r
8686
Reading [8687] u
8687
Reading [8688] m
8687
Reading [8689]  
8687
Reading [8690] e
8687
[Resumes correctly appending chars]
Reading [9226] i
8748
Reading [9227] p
8749
Reading [9228] t
8750
Reading [9229] i
8751
Reading [9230] o
8751
Reading [9231] n
8751

И так несколько раз. Размер кучи памяти, похоже, не является проблемой, так как я получаю 14128 свободных байтов из system_get_free_heap_size() после добавления всего. Я использую Wemos D1 R1, и это файл, который я пытаюсь полностью прочитать, для тестирования с использованием Github API


person PrOF    schedule 13.12.2019    source источник


Ответы (1)


Я обнаружил, что Arduino не может объединить строки из-за малого количества свободной памяти. Более того, класс String в Arduino, по-видимому, не имеет обработчика ошибок, поэтому он может молча выйти из строя, например, когда память слишком фрагментирована.

См. здесь: с форума Arduino и здесь: из обсуждения в Stack Overflow

Во многих случаях они предполагают, что вы можете предварительно выделить буфер с помощью вызова String backup(int).

Возможно, вы не могли заранее знать, насколько большой будет ваша строка, но, возможно, вы могли бы управлять этим. Например, дважды позвонив в вашу цель https. В первый раз просто узнать, насколько большим будет ваш ответ (и таким образом вы сможете выделить точное количество памяти); второй раз, чтобы эффективно читать.

person Professor Emeritus    schedule 14.12.2019