Я не могу использовать буфер без печати в моем Nodemcu esp8266
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#define WIFI_SSID "ssid"
#define WIFI_PASSWORD "password"
void setup() {
Serial.begin(9600);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(300);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
/////////////////////////////////////////////
std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
client->setInsecure();
HTTPClient http;
http.begin(*client, "https://jsonplaceholder.typicode.com/photos");
http.addHeader("Accept", "*/*");
int httpCode = http.GET();
Serial.print("HTTP CODE: "); Serial.println(httpCode);
//чтение ответа с буфером
static char buff[128] = { 0 };
while (http.connected() ) {
size_t size = client->available();
if (size) {
int c = client->readBytes(buff, ((size > sizeof(buff) ) ? sizeof(buff) : size));
// если я раскомментирую эту следующую строку, все в порядке.
//Serial.write(buff, c); Серийный.println();
// но если я не использую программу serial.write, она никогда сюда не попадет
if (char * pch = strstr (buff, "quis fuga")) {
char str[20] = { 0 }; int g = 0 ;
while (pch[g] != '\"') {
str[g] = pch[ g];
g++;
}
Serial.print("FOUND IT: "); Serial.println(str);
}
}
else if (!size) {
Serial.println( "reading done");
break;
}
delay(1);
}
}
void loop() {
delay(222222);
}
Обновление
здесь я создал компилируемый исполняемый код. в основном я пытаюсь найти слово в ответе http. ответ моего реального примера не является json, и он такой же длины, как ответ этого примера
. еще одна проблема, я не могу прочитать все ответы. он неожиданно заканчивает чтение иногда через несколько строк, иногда через несколько сотен. в этом конкретном запросе мой nodemcu не может прочитать после объекта id 258. или id 8. в ответе json: https://jsonplaceholder.typicode.com/ фото
Если я не использую содержимое буфера печати serial.write, чтение завершается мгновенно, и именно здесь у меня возникает проблема.
@alphaceph, 👍0
Обсуждение1 ответ
Лучший ответ:
Последовательная печать создает задержку. Эта задержка позволяет собрать больше символов в буфере. Если вы читаете ввод небольшими частями (от 3 до 10 байтов), то буфер не содержит искомой подстроки, потому что он разбивается на два последовательных буфера. Даже если вы смогли прочитать полные буферы, все равно может случиться так, что строка поиска будет разделена.
Для поиска строки в потоке данных вы можете использовать функцию find(string)
. Сетевой класс Client наследует эту функцию от класса Arduino Stream. find
будет читать поток, пока не найдет искомую строку. Затем при следующем чтении из потока данные будут считаны сразу после искомой строки.
- HTTP GET запрос с использованием Arduino Uno и ESP8266
- Как составить URL-адрес HTTP-запроса GET с параметрами ключ/значение
- ESP8266 Ошибка неверного запроса 400
- ESP8266 отправляет веб-страницу клиенту, но html-коды отображаются в браузере вместо веб-страницы
- Проанализировать большой ответ json с помощью ESP8266
- Какой максимальный размер статического документа Json в Arduino JSON?
- Код запроса ESP8266 GET -1
- ESP8266 не отвечает через случайные промежутки времени
Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат](https://chat.stackexchange.com/rooms/103739/discussion-on-question-by-alphaceph-i-cant-use-buffer-without-printing-in-my- нет)., @VE7JRO