如何修复 ESP32 esptool.py Running stub... StopIteration

问题:

烧录 ESP32 时,尤其是远程烧录时,你看到以下日志消息

esptool_running_stub_stopiteration.txt
Serial port rfc2217://10.1.2.3.105:4418
Connecting...
Device PID identification is only supported on COM and /dev/ serial ports.
..
Chip is ESP32-S2
Features: WiFi, No Embedded Flash, No Embedded PSRAM, ADC and temperature sensor calibration in BLK2 of efuse V2
Crystal is 40MHz
MAC: 60:55:f9:f0:3a:16
Uploading stub...
Running stub...
Traceback (most recent call last):
  File "/usr/local/bin/esptool.py", line 34, in <module>
    esptool._main()
  File "/usr/local/lib/python3.8/dist-packages/esptool/__init__.py", line 1004, in _main
    main()
  File "/usr/local/lib/python3.8/dist-packages/esptool/__init__.py", line 684, in main
    esp = esp.run_stub()
  File "/usr/local/lib/python3.8/dist-packages/esptool/loader.py", line 912, in run_stub
    p = self.read()
  File "/usr/local/lib/python3.8/dist-packages/esptool/loader.py", line 307, in read
    return next(self._slip_reader)
StopIteration

解决方案

此问题发生不是因为硬件缺陷,而是因为连接的延迟相当高,因此在脚本和引导加载程序之间的通信发生之前就超时了。

为了修复它,你需要编辑 esptool.py 安装中硬编码的默认超时!

首先,你需要确定安装中 loader.py 的位置。你可以从堆栈跟踪的以下部分简单地做到这一点:

esptool_loader_trace.txt
File "/usr/local/lib/python3.8/dist-packages/esptool/loader.py", line 912, in run_stub p = self.read()

在这种情况下,loader.py 位于

esptool_loader_location.txt
/usr/local/lib/python3.8/dist-packages/esptool/loader.py

你需要编辑以下行:

esptool_loader_mem_timeout.py
MEM_END_ROM_TIMEOUT = 0.05  # short timeout for ESP_MEM_END, as it may never respond

并增加超时 - 我的建议是将其增加到 2.5 秒。

… 或者你可以使用以下命令简单地更改超时:

esptool_fix_timeout.sh
sed -i -e 's/MEM_END_ROM_TIMEOUT = 0.05/MEM_END_ROM_TIMEOUT = 2.5/g' /usr/local/lib/python3.8/dist-packages/esptool/loader.py

之后,你的上传应该可以正常工作。


Check out similar posts by category: Electronics, Embedded, ESP8266/ESP32, Networking