Ошибка переполнения буфера в библиотеке ESP8266_SoftwareSerial

У меня возникают проблемы с буфером при запуске примера Firmware.ino здесь.

Вывод из моего последовательного журнала Arduino на скорости 115200 бод (я поставил ESP на скорость 9600 бод):

Begin
01:17:15.538 -> Baudrate set success
01:17:15.585 -> Station + softAP - OK
01:17:18.631 -> Joining AP successful, IP: 192.168 r⸮+@⸮
01:17:18.991 -> Single Mode OK
01:17:18.991 -> Sending Request to www.google.com
01:17:19.084 -> create tcp - OK
01:17:19.710 -> not sentbuffer is full!
01:17:20.022 -> HZiw93GUFmVJYFz-yRmahGURP_UBbRb4EF0Ahwzx8MJ1GOyC5Z0dns8UD41G8kUqnL0oxNPxa6xF9nAqNF3X3B_hKW11zoyaBPn8trvUNt-69qbFCNOZwNjgoaloKbOQs7NN-B3tpmwFKpHfKsfKyZfiMdhulN3SgZMhewYBg9c; expires=Wed, 05-Feb-2020 05:17:18 GMT; path=/; domain=.google.com; HttpOnly
01:17:20.162 -> Accept-Ranges: none
01:17:20.162 -> Vary: Accept-Encoding
01:17:20.209 -> ConnecS,
01:17:24.179 -> Sending Request to www.google.com
01:17:24.774 -> create tcp - ERROR
01:17:28.759 -> Sending Request to www.google.com
01:17:29.432 -> create tcp - ERROR
01:17:33.402 -> Sending Request to www.google.com
01:17:34.021 -> create tcp - ERROR
01:17:38.028 -> Sending Request to www.google.com
01:17:38.669 -> create tcp - ERROR
01:17:42.681 -> Sending Request to www.google.com
01:17:43.294 -> create tcp - ERROR
01:17:47.298 -> Sending Request to www.google.com
01:17:47.954 -> create tcp - ERROR
01:17:51.925 -> Sending Request to www.google.com
01:17:52.595 -> create tcp - ERROR
01:17:56.563 -> Sending Request to www.google.com
01:17:57.204 -> create tcp - ERROR
01:18:01.222 -> Sending Request to www.google.com
01:18:01.871 -> create tcp - ERROR
01:18:05.839 -> Sending Request to www.google.com
01:18:06.460 -> create tcp - ERROR
01:18:10.456 -> Sending Request to www.google.com
01:18:10.596 -> create tcp - OK
01:18:11.049 -> buffer is full!
01:18:11.049 -> 
01:18:11.049 -> 
01:18:11.049 -> +IPD,1430:HTTP/1.1 200 OK
01:18:11.096 -> Date: Tue, 06 Aug 2019 05:18:09 GMT
01:18:11.096 -> Expires: -1
01:18:11.096 -> Cache-Control: private, max-age=0
01:18:11.143 -> Content-Type: text/ht
l; charset=ISO-8859-1
01:18:11.143 -> P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
01:18:11.190 -> Server: gws
01:18:11.190 -> X-XSS-Protection: 0
01:18:11.190 -> X-Frame-Options: SAMEORIGIN
01:18:11.224 -> Set-CooS,
01:18:15.192 -> Sending Request to www.google.com
01:18:15.822 -> create tcp - ERROR
01:18:19.849 -> Sending Request to www.google.com
01:18:20.473 -> create tcp - ERROR

Как видите, сначала он запускается нормально, выдает ошибку буфера, какое-то время работает с ошибкой, а затем снова запускается нормально. Это происходит пару раз, потом запускается только с ошибкой. Я предполагаю, что это какая-то проблема с буфером ESP или Arduino, но я не уверен, как это диагностировать дальше.

Вещи, которые я пытался исправить ошибку: - Как упоминалось в комментариях к примеру Firmware.ino, я раскомментировал #define ESP8266_USE_SOFTWARE_SERIAL. - Также, как упоминалось в комментарии, я изменил строку 42 с 64 на 256. Оба раза это не сработало. - В включенной библиотеке ESP8266.h есть MAX_BUFFER_SIZE, который я также изменил с 300 на 256, потому что думал, что это может помочь, но ошибка осталась.

, 👍0

Обсуждение

Вы отправляете/получаете слишком много данных, и вам не хватает памяти, о чем говорит ошибка., @Gaurav Mall


1 ответ


Лучший ответ:

1

В этой библиотеке часто используется String, поэтому я бы не рекомендовал ее для всего, что вы хотите сделать стабильной, особенно с Uno.

Похоже, что библиотека создает соединение, сначала очищая буфер SoftwareSerial, а затем выполняя правильную AT-команду. Он ждет ответа 500 мс, прежде чем сдаться. Я подозреваю, что интервал ожидания иногда недостаточно велик для того, чтобы модуль мог получить, проанализировать и обработать команду перед ответом. Так что попробуйте увеличить его до 2000 мс в строке 773.

Сообщение buffer is full просто относится к собственному буферу библиотеки для хранения полученных данных, который по умолчанию составляет 300 байт. Буфер заполняется так быстро (и внутренний буфер SoftwareSerial, вероятно, тоже переполняется), потому что вы загружаете веб-страницу, подобную странице Google, которая имеет более 300 байтов только в заголовке ответа. Возможно даже, что к тому времени, когда следующий запрос начнется с другой AT-команды, ESP8266 все еще сбрасывает ответ от предыдущего запроса, поэтому ответ команды все еще находится далеко в очереди и поэтому не считывается до истечения времени ожидания.

Вместо этого попробуйте загрузить простую веб-страницу, например httpbin.org/ip. То есть в строках 952, 954:

char* request =  "GET /ip HTTP/1.1\r\nHost: www.httpbin.org\r\nConnection: close\r\n\r\n";

if (createTCP("www.httpbin.org", 80))
,

Спасибо! Можете ли вы порекомендовать какие-либо лучшие библиотеки для выполнения простых HTTP-запросов (возможно, проще, чем google.com) на Arduino Uno с использованием ESP8266?, @garson

@garson Это выглядит популярным с приличным интерфейсом: https://github.com/bportaluri/WiFiEsp. Если это решило вашу проблему, не забудьте проголосовать и принять ответ., @SoreDakeNoKoto

Это шаг в правильном направлении, хотя у меня все еще есть ошибки тайм-аута с этой библиотекой :(, @garson

О боже, это работает! Спасибо!, @garson