ESP32 медленное время прохождения туда и обратно по Wi-Fi
Я столкнулся с проблемой интерфейса Wi-Fi ESP32, которая показывает так много странных симптомов, что это трудно объяснить. Я попробую.
На ESP32 работает версия ConfigurableFirmata. Эта прошивка позволяет отправлять двоичные команды для управления периферийными устройствами ESP32.
Для этого теста я подключил ЖК-дисплей 20x4 и датчик температуры/влажности BME680, оба на I2C. Программное обеспечение работает на ПК. Он считывает датчик, а затем выводит результаты на дисплей. Каждая операция чтения или записи на шину I2C кодируется в сообщение, которое отправляется в ESP через Wi-Fi, а затем ESP выполняет операцию I2C, возвращая результат (если есть). Поскольку это бинарный протокол, сообщения короткие, обычно около 7 байт. Команды на BME680 требуют ответа от ESP (поскольку ПК хочет считать датчик), команды на дисплей отправляются в режиме «выстрелил-забыл», так как ответа от дисплея не ожидается. В типичном цикле у меня есть 4–5 операций чтения с датчика, за которыми следует около 160 операций записи на дисплей.
Теперь у меня есть следующие наблюдения:
- среднее время передачи данных на ESP32 составляет 2 мс.
- Время передачи команд датчика туда и обратно составляет около 5 мс.
- Однако иногда время выполнения команд датчика превышает 10 000 мс (!)
- Время основного цикла ESP32 никогда не превышает 10 мс (поэтому это не команды, выполнение которых внезапно занимает больше времени)
- Команды с медленным ответом идут первыми после обновления дисплея
- Используя WireShark, я вижу, что когда он замедляется, ПК отправляет сообщения о повторных попытках TCP
- Когда я вставляю искусственный сон после команд дисплея, проблема в большинстве случаев исчезает, но это ненадежно (если только сон не очень длинный)
- Когда я запрашиваю ответ после нескольких отображаемых команд, поведение снова становится стабильным. Общая производительность наилучшая, когда я запрашиваю ответ только после двух команд, в противном случае задержка снова достигает пика в 1000 мс.
- На проблему не влияет размер буфера чтения TCP на ESP32
Из-за всего вышеперечисленного я подозреваю, что какой-то аппаратный буфер внутри ESP32 переполняется, вызывая сообщения о повторных попытках TCP. А поскольку они (как я вижу) включают в себя большой блок предыдущих сообщений, проблема, вероятно, умножается.
Я думаю, что единственный выход – попытаться избежать отправки повторных попыток TCP. Есть ли способ заставить ESP чаще отправлять сообщения TCP ACK? Или уменьшить скорость, когда он не может догнать данные? Я использую последнюю версию ядра Arduino-ESP32 (из исходного кода).
@PMF, 👍0
Обсуждение0
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
- Контакты RX и TX на esp32
- ESP8266 TCP-соединение WiFiClient проблема
- Как запустить TCP-сервер сокетов на Arduino Uno WiFi?
- Почему OTA не работает с платой ESP32-CAM Ai-Thinker?
- ESP8266 отправляет TCP HEX-пакет из 4 символов
- ESP32 открывает "captive portal" при подключении
- Аналоговое чтение не работает при использовании WiFi
есть ли у esp32 хороший сигнал Wi-Fi? Я бы попытался стереть флэш с помощью esptool, чтобы удалить, возможно, неправильные данные калибровки Wi-Fi, а затем снова загрузить скетч., @Juraj
@Juraj Сделал это, никаких изменений.
WiFi.RSSI()
постоянно сообщает значения порядка -70. Это хорошо?, @PMF-70 дБм минимум. оно должно быть не менее -67 дБм https://www.metageek.com/training/resources/understanding-rssi/, @Juraj
@Juraj Даже если я достигну -60 или выше, проблема не изменится. Поскольку
ping
не теряет никаких пакетов, я не думаю, что проблема связана с самой физической связью., @PMF