如何修复 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
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow