0

我正在做一个 Arduino 项目,该项目将为我混合鸡尾酒。我决定将鸡尾酒列表保存在名为鸡尾酒会.json 的 JSON 文件中,该文件保存在 SD 卡上,并且在选择鸡尾酒时,我希望 Arduino 在 JSON 文件中找到它的配方。JSON 的一小段代码如下所示:

{
  "Cocktails": {
        "Americano": {
            "campari": 1
            "red vermouth": 2
            "soda": 3
        },
        "Aviation": {
            "gin": 1,
            "cherry liqueur": 2,
            "creme de violette": 3,
            "lemon juice": 4
        },
        "B52 Cocktail": {
            "kahlua": 1,
            "baileys": 2,
            "trand marnier": 3
        }
    }
}

假设我告诉 Arduino 我想要鸡尾酒“美式咖啡”。我希望 Arduino 复制对象“Americano”下的所有数据并将其保存到我在以下结构中创建的二维数组中:


struct cocktailData
{
  char name[25];
  char portions[7][1];
} data;

该数组被初始化为 [7][1],因为最多有 8 种潜在成分,并且它们都与数量乘数配对。我不知道如何将整个字符串复制到数组中,以便将配方保存在内存中。我使用 ArduinoJson 库来解析 JSON 文件。最终目标是数组看起来像这样:


portions[0-7][0]=

"campari", "red vermouth", "soda", (the rest is null)

portions[0-7][1]=
1, 2, 3, (the rest is null)
4

1 回答 1

0

正如我在评论中提到的,如果您在 SD 中保存数据(并编写 C++),则无需添加额外的 JSON 编码/解码层,您可以使用 C++ 结构读取和写入数据。

在展示如何将结构读/写到文件中之前,您显示的结构不会保存您要表示的数据,每个鸡尾酒配方都由名称(一个字符串)和一个成分数组组成,每种成分都包含一个表示酒类和份量类型的字符串和字节。所以我们正在处理一个结构中的一个结构。

typedef struct {
  char liquor[20];
  uint8_t portion;
} Ingridient;

typedef struct {
  char name[20];
  Ingridient ingridients[7];
} Cocktail;

Cocktail cocktails[] = {
    {"Americano", { {"campari", 1}, {"red vermouth", 2}, {"soda", 3} } },
    {"Aviation", { {"gin", 1}, {"cherry liqueur", 2}, {"creme de violette", 3}, {"lemon juice", 4} } },
    {"B52 Cocktail", { {"kahlua", 1}, {"baileys", 2}, {"trand marnier", 3} } }
};

将 struct 写入文件或从文件中读取 struct 就像将一系列字节写入文件一样,您需要做的就是告诉您的 struct 在内存中的位置(即指向 struct 的指针),以及是结构的大小。

由于我没有带 SD 卡的 Arduino,所以我在 ESP32 上使用 SPIFFS 展示它,它应该与 SD 非常相似,并且您应该没有问题将代码转换为与 SD 卡一起使用。

这是完整的示例。

#include <SPIFFS.h>

typedef struct {
  char liquor[20];
  uint8_t portion;
} Ingridient;

typedef struct {
  char name[20];
  Ingridient ingridients[7];
} Cocktail;

void setup() {
 
  Serial.begin(115200);

  Cocktail cocktails[] = {
    {"Americano", { {"campari", 1}, {"red vermouth", 2}, {"soda", 3} } },
    {"Aviation", { {"gin", 1}, {"cherry liqueur", 2}, {"creme de violette", 3}, {"lemon juice", 4} } },
    {"B52 Cocktail", { {"kahlua", 1}, {"baileys", 2}, {"trand marnier", 3} } }
  };
 
  if(!SPIFFS.begin()){
      Serial.println("Error while mounting SPIFFS");
      return;
  }
 
  //--------- Write a struct to file
  File fileToWrite = SPIFFS.open("/cocktails.txt", FILE_WRITE);
  
  if(fileToWrite) {
    for (int i=0; i<3; i++) {
      fileToWrite.write( (uint8_t *) &cocktails[i], sizeof(cocktails[i]) );
    }
  }
  
  fileToWrite.close();
  
  
  //---------- Read a struct from file
  Cocktail c[3];  //struct for holding the content from the file
  
  File fileToRead = SPIFFS.open("/cocktails.txt");
  
  if(fileToRead) {
    Serial.println("Data from file...");
    for (int i=0; i<3; i++) {
      fileToRead.read( (byte *) &c[i], sizeof(c[i]) );
      Serial.println(c[i].name);
      int n = 0;
      while (strlen(c[i].ingridients[n].liquor)) {
        Serial.print(c[i].ingridients[n].liquor);
        Serial.print(" - ");
        Serial.print(c[i].ingridients[n].portion);
        n++;
      }
      Serial.println();
    }
  }

  fileToRead.close();
}
 
void loop() {}
于 2021-08-27T12:41:53.293 回答