ESP32 esptool.py Running stub... StopIteration beheben

English Deutsch

Problem:

Beim Flashen eines ESP32, insbesondere beim Remote-Flashen, sehen Sie die folgende Protokollmeldung:

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

Lösung

Dieses Problem tritt nicht wegen eines Hardware-Defekts auf, sondern weil die Latenz der Verbindung recht hoch ist und daher das Timeout auftritt, bevor die Kommunikation zwischen Skript und Bootloader stattfinden kann.

Um es zu beheben, müssen Sie das hartcodierte Standard-Timeout in der esptool.py-Installation bearbeiten!

Zuerst müssen Sie den Speicherort von loader.py in Ihrer Installation identifizieren. Sie können dies einfach anhand des folgenden Teils des Stack-Trace tun:

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

In diesem Fall befindet sich loader.py unter

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

Sie müssen die folgende Zeile bearbeiten:

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

und das Timeout erhöhen – meine Empfehlung ist, es auf 2.5 Sekunden zu erhöhen.

… oder Sie können das Timeout einfach mit dem folgenden Befehl ändern:

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

Danach sollte Ihr Upload einwandfrei funktionieren.


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