我使用连接到以太网模块的Atmega2560获取Esp32的二进制文件,然后通过UART将该文件发送到Esp32以更新其固件。
我试图使用HttpClient库通过以太网模块获取二进制文件数据,但是当存储在Esp32 OTA分区中的数据时,我得到的是:
esp_image: Checksum failed . Calculated 0xad read 0x0在发送到esp32之前,当我检查二进制文件中接收到的一些数据时,我可以看到某些位置有0x0,而不是正确的值。
这是我的代码的一部分,我在其中读取二进制文件并将其发送到Esp32。
EthernetClient transport;
HttpClient client(transport, SERVER, SERVER_PORT);
Serial.print("Check for update file ");
Serial.println(PATH);
client.get(PATH);
int statusCode = client.responseStatusCode();
Serial.print("Update status code: ");
Serial.println(statusCode);
if (statusCode != 200)
{
client.stop();
return;
}
long bin_length = client.contentLength();
if (bin_length == HttpClient::kNoContentLengthHeader) {
client.stop();
Serial.println("Server didn't provide Content-length header. Can't continue with update.");
return;
}
Serial.print("Server returned update file of size ");
Serial.print(bin_length);
Serial.println(" bytes");
ESPSerial.print(String(bin_length)); //send file size to ESP
delay(10000);
byte data_char;
int counter=0;
while (bin_length > 0)
{
if (!client.readBytes(&data_char, 1)) // reading a byte with timeout
break;
ESPSerial.write(data_char); //here send data to esp32
if(bin_length==0||bin_length==1||bin_length==2){Serial.print("last data=");Serial.println(data_char,HEX);}
counter++;
if(counter==1000)
{
Serial.println(bin_length);
counter=0;
delay(100);
}
bin_length--;
}
client.stop();
if (bin_length > 0)
{
Serial.print("Timeout downloading update file at ");
Serial.print(bin_length);
Serial.println(" bytes. Can't continue with update.");
return;
}有人能帮我解决这个问题吗?
发布于 2021-03-15 19:08:12
我对ESP32板也有同样的问题,结果发现这是一个电源问题,因为在OTA期间,Wifi消耗更多的电流。
确保你的电池是充电的,或者在OTA过程中通过电源线路使用一个大的电容器来保持高电压。
https://stackoverflow.com/questions/61564179
复制相似问题