Помогите с простой реализацией Nano + ESP8266. Get запрос + обработка ответа.
- Войдите на сайт для отправки комментариев
Добрый день господа профи!!
Помогите пожалуйста с вроде как относительно простой задачей.
Разбираюсь уже неделю, перечитал пол-интернета и сотню примеров.
Есть Nano + ESP8266(v0.9.2.2).
Требуется посылать запрос на сервер.
Получить ответ (json), отфильтровать хедер, json разобрать по переменных.
Немогу никак ответ от ESP8266 и от сервера записать в переменную для дальнейшей обработки.
Тоесть хотел чтение из 'softserial' сделать не через цикле loop просто для дебага, а после каждой команды в 'softserial' чтобы получить ответ в переменную в дальнейшем.
Схема простая:
TX-10
RX-11
CH_PD,VCC-3.3V
GND-GND
Также пробовал подключать к TX, RX к 0 и 1
Также пробовал подключать стандартные библиотеки <WiFi.h> но при этом не знаю как подключить ESP8266 к свему Nano.
Вот то что есть последнее из кода:
#include <SoftwareSerial.h> String SID = "ххххххххх"; String PAS = "хххххххх"; String IP = "api.ipify.org"; String s = ""; //String GET = "GET /?format=json HTTP/1.1\r\nHost: "+IP+"\r\nConnection: close\r\n\r\n"; String GET = "GET /?format=json HTTP/1.1\r\nHost: "+IP+"\r\n\r\n"; SoftwareSerial softserial(10, 11); // RX, TX void setup() { softserial.begin(9600); Serial.begin(9600); softserial.println("AT"); serialread(); softserial.println("AT+CWMODE=1"); serialread(); delay(1000); softserial.println("AT+CWJAP=\"" + SID + "\",\"" + PAS + "\""); serialread(); delay(5000); softserial.println("AT+CIPSTART=\"TCP\",\"" + IP + "\",80"); serialread(); delay(500); softserial.print("AT+CIPSEND="); softserial.println(GET.length() + 2); serialread(); delay(100); softserial.println(GET); serialreadd(); } void loop() { } void serialread() { while (softserial.available()) { delay(20); if (softserial.available() > 0) { char c = softserial.read(); s += c; } } Serial.println(s); s = ""; }
Ответ в сериел монитор:
AT OK AT+CWMODE=1 no change AT+CWJAP="dlink16","380937957490" OK AT+CIPSTART="TCP","api.ipify.org",80 OK Linked AT+CIPSEND=53 > GET /?format=json HTTP/1.1 Host: api.ipify.org SEND OK +IPD,184:HTTrtni 7hr0
Последний ответ от сервера +IPD... не полностью считывается. Не пойму почему.
Помогитепожалуйста расставить все по местам.
Можем у кого-то буду другие идеи и может я копаю вообще не в том направлении.
Заранее благодарен.
ciryulnik, сроки, конечно, высокоуровневая конструкция, с которой удобно работать, но она достаточно прожорлива с точки зрения расхода памяти. Вы же использование памяти никак не контролируете. Первая мысль - Вам просто не хватает оперативной памяти, чтобы принять ответ полностью.
Попробуйте так :
Величина пауз для начала побольше, затем методом "тыка" определите минимально рабочие значения.
Спасибо, Araris.
Перепробовал. Всевравно получаю на последнем єтапе:
Может быть что для моей задачи действительно технически нужно что то серъезнее чем Nano + ESP8266 ??
Спасибо.
И можно ли использовать всетаки стандартную библиотеку <WiFi.h> для Nano + ESP8266 ? Может кто знает?
Как подключать тогда Nano к ESP8266 ?
Спасибо.
Похоже, в ответ приходит объём информации, переполняющий приёмный буфер softserialа (64 байта по умолчанию, можно увеличить), и превращающий содержимое его в "кашу".
А попробуйте-ка ещё так :
Тоже самое ((.
Может есть другие методы дебага?
Или другие пути реализации задачи без использования softserial ?
Так-с. А попробуйте вместо api.ipify.org с сайтом Гугла побороться, отправьте
GET / HTTP/1.0\r\n
Host: google.com\r\n
\r\n
ничего ((
Увы, не пойму я, что у Вас не так (((.
Простите, что не смог помочь.
ciryulnik, перенесите
Serial
.println(s);
внутрь цикла while. Для отладочных целей можете еще добавить перед ним длину строки и объем свободной памяти. "Простыня", правда, получится будь здоров, но, возможно, удастся понять, в каком точно месте возникает проблема.Да, спасибо.
Разобрался. Вся проблема с доступной памятью.
У меня функция "void serialread()" не в постоянном цикле поэтому переменная s не очищается "заполняется при ответах до максимума".
Для начала увеличил "#define _SS_MAX_RX_BUFF 1024" (было 64) в \hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.h
Ну и переместил чтение в цыкл loop.
Еще нашел неплохой пример сдесь - http://rootpower.com/?p=73
Всем спасибо.
Сейчас делаю тоже самое, не могу понять Ваши изменения которые вы описали в последнем сообщении
И не могу понять где мне увидить контент страницы