A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header. This is an error on which I have spent long hours trying to figure out what’s causing it and how to fix it. If you are struggling with the same error on Windows, stick with me, I’ll show you how to fix it.
For example in my case, the issue manifests itself on a single windows computer out of 4 tested and it doesn’t really matter at which baud rate I’m trying to upload it can be 115K or 900K, it doesn’t matter if you are using Arduino IDE or PlatformIO, I still get the error because it’s not caused by the IDE. And also I’ve experienced this with both FTDI and Silabs chips. Sometimes the behavior can be random, meaning it might work 1 out of 10 tries which can get really frustrating, especially if it happens in the most inappropriate times as these problems tend to happen.
First I tried understanding the issue, this is clearly a problem with how the ESP32 resets, it doesn’t go into the correct bootloader mode for code upload. By looking at this repository which is managed by Espressif we get some info on the expected sequence, and we learn that the ESP32 should have GPIO0 pulled low during reset for it to go into serial bootloader mode. Reset is triggered by pulling the EN or Reset pin low. They don’t give us a clear timing diagram of what this should look like but I’m going to assume the state of GPIO0 is read while EN signal goes back high to release it from reset. So the logic thing was to put a scope on these signals and check it out.