ESP32 медленное время прохождения туда и обратно по Wi-Fi

esp32 wifi tcpip delay

Я столкнулся с проблемой интерфейса 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 (из исходного кода).

, 👍0

Обсуждение

есть ли у 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