Не хватает памяти в Nano для получения инфы после GET запроса
- Войдите на сайт для отправки комментариев
Ср, 11/10/2017 - 01:31
Брал скетч ТУТ
#include <SoftwareSerial.h> String SID = "*****"; String PAS = "*****"; String IP = "sait.ru"; String s = ""; int i=0; String ii = ""; String GET = ""; SoftwareSerial softserial(10, 11); // RX, TX void setup() { softserial.begin(9600); Serial.begin(9600); softserial.println("AT"); sr(); softserial.println("AT+CWMODE=1"); sr(); delay(1000); softserial.println("AT+CWJAP=\"" + SID + "\",\"" + PAS + "\""); sr(); delay(5000); } void loop() { ii=i+1; i=i+1; GET = "GET /?test="+ ii +" HTTP/1.1\r\nHost: tceh.artgrain.pro\r\n"; softserial.println("AT+CIPSTART=\"TCP\",\"" + IP + "\",80"); sr(); delay(500); softserial.print("AT+CIPSEND="); softserial.println(GET.length() + 2); sr(); delay(100); softserial.println(GET); sr(); delay(10000); } void sr() { while (softserial.available()) { delay(20); if (softserial.available() > 0) { char c = softserial.read(); s += c; } } Serial.println(s); s = ""; }
В итоге мне не хватает памяти для получения полного ответа от сервера, как это можно исправить?
Вот что от сервера приходит
+IPD,173:HTTP/1.1 200 OK Server: nginx Date: Tue, 10 Oct 2017 21:29:17 GMT Content-Type: text/html; charse
1. не понятно зачем 52 строка. хотя бы уменьшите задержку в 10 раз
2. не накапливайте (55 стр) а сразу выводите в сериал символ
3. от String избавитесь - много памяти освободите
4. Не знаю какая именно у вас нана. Но знайте, что у вас не больше 2048 байт оперативной памяти на всё. А это 2 килобайта или 0,002 мегабайта примерно.
Спасибо. Вечером попробую
В итоге мне не хватает памяти для получения полного ответа от сервера, как это можно исправить?
Наиболее прямой способ - даже не пытаться сохранить полный ответ, а парсить его по мере поступления.
Ну а так, по мелочи, желательно избавиться от String и перенести текстовые константы в PROGMEM.
если я правильно понял - вы не видите полный ответ по RX / TX ?
у меня аналогично было при получении ответа от GSM модема по SoftwareSerial,
менял исходники, сейчас попробую найти в каком месте.
..........\arduino\avr\libraries\SoftwareSerial\src
SoftwareSerial.h
я увеличивал вот это число:
#define _SS_MAX_RX_BUFF 128 // RX buffer size
Когда было меньше переменных ответ полный призодил
еще не менял код чтоб проверить
сразу еще вопрос, как отловить именно текст сраницы, чтоб не было всего остального
.я увеличивал вот это число:
#define _SS_MAX_RX_BUFF 128 // RX buffer size
andycat - это костыль. В большинстве случаев ответ на GET запрос имеет размер десятки и даже сотни килобайт, так что увеличение буфера на сотню байт тут помогает слабо. Единственный путь - получать данные порциями и тут же обрабтывать. Если программа не успевает - можно понизить скорость канала.
я накапливал сразу в тип String а не в char как у вас, а потом уже парсил полный текст
задержка можкт и не нужна - зависит от "тормознутости" конкретного устройства
Тоже попробую
а нащет парсить полный текст, как его можно отобрать?
я накапливал сразу в тип String а не в char как у вас, а потом уже парсил полный текст
задержка можкт и не нужна - зависит от "тормознутости" конкретного устройства
Задержка на 50мс после каждого символа?! - не просто не нужна. а скорее убийственна для связи... Удивляюсь, как при ней вы вообще что-то могли принять... У вас только один заголовок HTTP будет приниматься секунд пятнадцать
ну например так, но если команд более 5 рекомендуется уже более серьезные алгоритмы
жкт и не нужна - зависит от "тормознутости" конкретного устройства
Задержка на 50мс после каждого символа?! - не просто не нужна. а скорее убийственна для связи... Удивляюсь, как при ней вы вообще что-то могли принять... У вас только один заголовок HTTP будет приниматься секунд пятнадцать
э... вы меня с ТС перепутали, я максимум SMS принимаю символов из 10 а не HTTP
А зачем использовать софтварный порт? Аппаратный занят?
э... вы меня с ТС перепутали, я максимум SMS принимаю символов из 10 а не HTTP
для СМС тоже задержка в 50мс не нужна. Хотя при длине в 10 символов это не так критично :)
А зачем использовать софтварный порт? Аппаратный занят?
это был мой первый проект и я пошел по наипростейшему пути
А зачем использовать софтварный порт? Аппаратный занят?
мне кажется, это мало что изменит. Суть проблемы в большом объеме принимаемых данных, а не в скорости или стабильности работы порта.
А зачем использовать софтварный порт? Аппаратный занят?
это был мой первый проект и я пошел по наипростейшему пути
То есть, специально подключать библиотеку для софтварного порта, вместо того чтобы просто использоть хардварный (без всяких библиотек) - это простейший путь? Новичков трудно понять...
А зачем использовать софтварный порт? Аппаратный занят?
это был мой первый проект и я пошел по наипростейшему пути
То есть, специально подключать библиотеку для софтварного порта, вместо того чтобы просто использоть хардварный (без всяких библиотек) - это простейший путь? Новичков трудно понять...
да :) я не знал (дя и сейчас не знаю, т.к. пока не требуется, мне кажется это невозможно) как одновременно использовать консоль для тестирования и работать с COM портом модема
откуда этот код?
откуда этот код?