我花了很长时间解决这个问题。 我正在打开从ESP32到NodeJS后端的websocket连接。收到消息时,将使用ArduinoJSON解析内容。
我将解析的内容存储在全局变量中,以便可以在我的void loop()中访问它们。每次收到新消息时,它们都会被覆盖。那就应该这样。
变量声明:
uint8_t brightness = 10;
uint8_t lastMillis = 0;
int ArrayPointer = 0;
int interval = 2000;
bool immediate = true;
const size_t capacity = JSON_ARRAY_SIZE(32) + JSON_OBJECT_SIZE(1) + 290;
在void Setup()之后
void onMessageCallback(WebsocketsMessage message) {
Serial.print("Got Message: ");
DynamicJsonBuffer jsonBuffer(capacity);
JsonObject & JSONResponse = jsonBuffer.parseObject(message);
JsonArray & PixelArray = JSONResponse["frame"];
brightness = JSONResponse["brightness"];
ArrayPointer = 0;
immediate = true;
}
void loop() {
client.poll();
if(millis() - lastMillis >= interval || immediate == true) {
// Here I would like to access the Variable PixelArray
lastMillis = millis();
}
}
我当然不能在void循环中访问PixelArray,因为它的作用域不同。 现在,我需要一种使PixelArray可以全局访问的方法。
我尝试过的事情:
希望有人能帮助我;)
预先感谢;)
PS:当前我正在使用ArduinoJson 5,但是升级不会有问题。
答案 0 :(得分:1)
不要那样做。
您应该仅使用ArduinoJson来序列化和反序列化JSON对象,而不是存储程序状态。 Its documentation makes that very clear.
做到这一点的正确方法(设计使用ArduinoJSON包的方法)是维护内部数据结构,并将JSON对象序列化和反序列化。
因此,您将拥有一个全局变量,该变量将是PixelArray
的内部表示形式,然后在收到JSON消息时将值从JsonArray复制到该变量。您在这里正确使用了brightness
;您应该对PixelArray
做同样的事情。