我正在尝试为 ESP32 芯片编写代码,它从 DHT22 传感器获取读数,将其打包成 json 文件,然后将其发送到 Flask 服务器。一切工作正常,直到我尝试发布,我收到以下错误:
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x400d3488 PS : 0x00060030 A0 : 0x800d355c A1 : 0x3ffb1bb0
A2 : 0x00000000 A3 : 0x3ffb1bff A4 : 0x00000001 A5 : 0x00000001
A6 : 0x00000000 A7 : 0x00000000 A8 : 0x00000000 A9 : 0x00000000
A10 : 0x00000000 A11 : 0x3ffcb8fc A12 : 0x00000050 A13 : 0x00000001
A14 : 0x00000000 A15 : 0x00000000 SAR : 0x0000000a EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000008 LBEG : 0x4000c2e0 LEND : 0x4000c2f6 LCOUNT : 0xffffffff
我对此问题进行了详尽的搜索,但无济于事,我不知道发生了什么。有人能提供有关如何解决此问题的见解吗?
这是我的 Arduino 代码:
#include <HTTPClient.h>
#include <WiFi.h>
#include <DHT.h>
#include <ArduinoJson.h>
#define DHTTYPE DHT22
const char* ssid = "ssid";
const char* password = "password";
uint8_t sensor = 16;
DHT dht(sensor, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting...");
}
Serial.println("Connected!");
}
void loop() {
if(WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin("http://192.168.10.5:8090/");
http.addHeader("Content-Type", "text/plain");
Serial.println("Began http on Flask");
const int cap = JSON_OBJECT_SIZE(2);
StaticJsonDocument<cap> doc;
Serial.println("Created json document");
doc["temperature"] = dht.readTemperature();
doc["humidity"] = dht.readHumidity();
Serial.println("Read temperature and humidity correctly");
char output[256];
serializeJsonPretty(doc, output);
Serial.println(output);
//Code will give back error after trying to POST
int httpCode = http.POST(output);
Serial.println("Got httpCode");
if(httpCode > 0) {
Serial.println(httpCode);
} else Serial.println("Error in Connection");
http.end();
}
delay(10000);
}
这里有 print 语句,它们会根据进入代码的程度打印出各种内容。它可以很好地打印出 json 文档,但不会打印出“Got httpCode”。下面是我的 Flask 服务器代码:
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods = ['POST'])
def hello():
req = request.get_json()
print(req)
return "Thanks", 200
if __name__ == "__main__":
app.run(host = '0.0.0.0', port = 8090)
提前感谢您的帮助。
我在使用WebSockets时也遇到了这个错误。
事实证明,我用于接收消息的缓冲区(全局声明)是追加新消息,而不是覆盖其中预先存在的内容。因此,进行了非法内存写入尝试,设备出现恐慌并重新启动。
解决方案: 我只是在 onWebSocketEvent() 函数内部本地声明了缓冲区,并且覆盖问题得到了解决,因为在每个事件上都重新声明了缓冲区,以防止非法内存写入尝试。该设备再也没有出现过恐慌。
我在回调过程中遇到了 Guru 错误,原因是微内存不足。解决方案是摆脱未使用的库并使用指针而不是创建局部变量。
我最近在进行原型设计的 ESP32 库上遇到了类似的错误(请参阅此处 https://github.com/aeonSolutions/aeonlabs-ESP32-C-Base-Firmware-Libraries#readme)我初始化测量类。
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x4200a746 PS : 0x00060b30 A0 : 0x820052d9 A1 : 0x3fcebb40
A2 : 0x00000000 A3 : 0x3fcf30a8 A4 : 0x3fcf75c4 A5 : 0x3fcf6888
A6 : 0x3fcf655c A7 : 0x3c13ea43 A8 : 0x8200a746 A9 : 0x3fcebb20
A10 : 0x00000006 A11 : 0x00000004 A12 : 0x00000078 A13 : 0x0000002c
A14 : 0x0000002b A15 : 0x0000e100 SAR : 0x0000000c EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000000 LBEG : 0x400556d5 LEND : 0x400556e5 LCOUNT : 0xfffffffe
Backtrace: 0x4200a743:0x3fcebb40 0x420052d6:0x3fcebc00 0x42030726:0x3fcebc90
EXCVADDR: 0x00000008
中的通常表示空指针类型的错误。检查代码中是否有未初始化的变量。
在我的这个特殊情况下,MEASUREMENTS_CLASS 未初始化,尽管调用成员函数/方法仍然有效,但带有变量赋值的第一行代码会导致代码崩溃并出现上述错误。为了解决这个问题,我只需要从以下位置正确初始化类:
#include "measurements.h"
MEASUREMENTS_CLASS* measurements;
到
#include "measurements.h"
MEASUREMENTS_CLASS* measurements = new MEASUREMENTS_CLASS();
当您访问索引或任何超出范围的内容时,您基本上会收到 LoadProhibited 错误。在访问它们之前检查初始化和定义是否正确。