使ArduinoJSON数组全局可用

我花了很长时间解决这个问题。 我正在打开从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可以全局访问的方法。

我尝试过的事情:

  • 在void Setup()之前声明了一个全局JsonArray,但这引发了一个错误;(。
  • 将其分配给另一个(全局)阵列无法正常工作,因为PixelArray的大小有所不同。

希望有人能帮助我;)

预先感谢;)

PS:当前我正在使用ArduinoJson 5,但是升级不会有问题。

jolon_zhang 回答:使ArduinoJSON数组全局可用

不要那样做。

您应该仅使用ArduinoJson来序列化和反序列化JSON对象,而不是存储程序状态。 Its documentation makes that very clear.

做到这一点的正确方法(设计使用ArduinoJSON包的方法)是维护内部数据结构,并将JSON对象序列化和反序列化。

因此,您将拥有一个全局变量,该变量将是PixelArray的内部表示形式,然后在收到JSON消息时将值从JsonArray复制到该变量。您在这里正确使用了brightness;您应该对PixelArray做同样的事情。

本文链接:https://www.f2er.com/3157070.html

大家都在问