Ошибка переполнения буфера в библиотеке 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, потому что думал, что это может помочь, но ошибка осталась.
@garson, 👍0
Обсуждение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
- AT-команда не отвечает на последовательный монитор
- Получить данные с сайта с помощью ESP8266 с помощью AT-команд
- Программное обеспечениеSerial с ESP8266
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- Отправить строку данных из Arduino UNO в ESP8266-01
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Отправьте несколько значений из Arduino Uno в nodeMCU, используя последовательный порт.
- Повреждение данных SoftwareSerial - поиск предложений
Вы отправляете/получаете слишком много данных, и вам не хватает памяти, о чем говорит ошибка., @Gaurav Mall