我正在尝试为ESP32芯片编写代码,它从DHT22传感器读取数据,将其打包到json文件中,然后将其发送到Flask服务器。一切都很好,直到我尝试POST,在那里我得到了以下错误:
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文档,但不会打印出"得到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错误,原因是micro内存不足。解决方案是去掉未使用的库,使用指针而不是创建局部变量。
我最近在制作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
在CCD_ 1中通常表示一种空指针类型的错误。检查代码中是否有未初始化的变量。
在我的这个特殊情况下,MEASUREMENTS_CLASS没有初始化,尽管调用成员函数/方法仍然有效,但带有变量赋值的第一行代码会导致代码崩溃,并出现上述错误。为了解决这个问题,我只需要从正确初始化类
#include "measurements.h"
MEASUREMENTS_CLASS* measurements;
至
#include "measurements.h"
MEASUREMENTS_CLASS* measurements = new MEASUREMENTS_CLASS();