Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

ESP8266 скачивает файл не полностью

Тема в разделе "Общие вопросы по esp8266", создана пользователем Topcat, 12 июн 2018.

  1. Topcat

    Topcat Новичок

    Сообщения:
    7
    Симпатии:
    0
    Прошу помочь с решением проблемы, которая, как сказали бы западные esp-шники "is driving me nuts".
    Пишу скрипт, в процессе которого происходит следующее:
    1. После включения происходит обращение к удаленному серверу (WiFiClient) и скачивание двух json-файлов (маленького (2кб) и большого (около 16кб)).
    2. Через секунд пять эта операция повторяется заново.
    3. В дальнейшем скачивания происходят каждые пять минут.

    Проблема заключается в том, что на этапе два большой файл у меня скачивается не полностью, каким-то обрезанным (вывожу его через serial monitor). И в дальнейшем (этап три) полностью он уже больше не скачивается - где-то после трех четвертей идет обрыв.

    Код не привожу, так как он довольно большой, но если надо могу привести фрагмент со скачиванием. Не понимаю, в чем дело и куда копать - проблема с памятью? Проблема с коннектом? Какие-то глюки? Подскажите даже не решение, а хотя бы на что следует обратить внимание
     
  2. NeoroN

    NeoroN Читатель

    Сообщения:
    150
    Симпатии:
    22
    Памяти не хватает.
     
  3. Topcat

    Topcat Новичок

    Сообщения:
    7
    Симпатии:
    0
    А есть какая-то хитрость, чтобы обойти это? В первый-то раз скачивается полностью...
     
  4. Topcat

    Topcat Новичок

    Сообщения:
    7
    Симпатии:
    0
    Решил проблему. Дело действительно оказалось в нехватке памяти. Сделал так: переменную с json объявляю не глобальной, а локальной. При открытии записываю файл во флеш, а затем, когда необходимо, считываю его в другую локальную переменную.
     
  5. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    551
    Симпатии:
    63
    Не жалко вам флеша то? Ресурс его по количеству записей ограничен, постоянной записью вы можете его убить.
     
  6. Topcat

    Topcat Новичок

    Сообщения:
    7
    Симпатии:
    0
    Ну, другого варианта обработки данных я пока не придумал...
     
  7. nikolz

    nikolz Гуру

    Сообщения:
    4.747
    Симпатии:
    452
    пишите в RAM 16 кбайт умещается без проблем
    свободной памяти должно быть не менее 30 кбайт
     
    Последнее редактирование: 13 июн 2018
  8. Topcat

    Topcat Новичок

    Сообщения:
    7
    Симпатии:
    0
    Вот тут pellepl/spiffs утверждается, что повторяемый каждую секунду цикл чтения/записи выведет память из строя через год. Уменьшение частоты обращения к файлу до раза в минуту увеличит срок жизни памяти до 58 лет.

    А по поводу записи в RAM — я такой подход еще не использовал. Не подскажите, какая библиотека позволяет реализовать это?
     
  9. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.618
    Симпатии:
    180
    Все ваши переменные и так в RAM находятся .
    JSON для обработки данных требует много памяти.
    Посылайте только те данные, которые изменились или посылайте их в чистом виде.
    How to reduce memory usage?
     
  10. nikolz

    nikolz Гуру

    Сообщения:
    4.747
    Симпатии:
    452
    выкиньте JSON.
    Делайте проще и все уместится.
     
  11. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    551
    Симпатии:
    63
    О как! за одно и выкинуть удаленный сервер, зачем он такой нужен, а после этого уже можно и есп выкинуть.

    Решал почти такую же задачу, получаю данные погоды с сервера, форекасты в джейсоне до 15К.
    Данные структурированные один элементов содержит массив джейсонов каждый из которых по отдельности не превышает 500 байт и без проблем разбирается.
    После выполнения http клиентом метода get, получаю большую строку контента, нахожу начало и конец массива, далее выделяю каждый элемент (каждый джейсон объект) и выполняю его разбор обычным StaticJsonBuffer.parseObject
    Посмотрите update_forecast(const String& query)
     
  12. nikolz

    nikolz Гуру

    Сообщения:
    4.747
    Симпатии:
    452
    Так как формат принимаемых данных у вас фиксированный то можно все растащить без JSON и возможно даже на лету.
    Для этого вполне хватит места а софт будет не больше 10 кбайт да и тот будет во флеш. А весь разбор делать надо на СИ.
    Решал подобную задачу без JSON , когда делал торгового робота для биржи.
     

Поделиться этой страницей