从 Arduino 中的函数返回一个初始长度未知的字符数组

Returning a char array of initially unknown length from a function in Arduino

我需要将 json 发送到服务器。该代码工作完美,但因为我需要在两个位置调用它,因此想要使用它来实现我们的功能。但是,我无法让它与 char 数组一起使用。一种可能性是将 char 数组转换为我期望的 String,但这不是我期望的内存效率。所以我想我会传递一个指针,在函数中分配大小,然后 return 长度。但它似乎没有用,'encoded' char* 似乎是空的。

这可能是我做错的基本问题。

这是代码:

      Serial.println("Connected");

      char* encoded;
      int contentLength = generateData(encoded);
      Serial.print("Data to be send, length: "); Serial.print(contentLength); Serial.println(" Data: "); Serial.println(encoded);
      // Send request to the server:
      client.println("POST /api/heartbeat HTTP/1.1");
      client.println("Host: localhost");
      client.println("Accept: */*");
      client.println("Content-Type: application/x-www-form-urlencoded");
      client.print("Content-Length: ");
      client.println(contentLength + 5);
      client.println();
      client.print("data=");
      client.print(encoded);

      // Done here, as the response availability sometimes takes time.
      lastConnection = millis();
      updateServer = false;
      free(encoded);

和函数:

int generateData(char* encoded) {   
  Serial.println("Preparing the data to be send....");
  String inputString = "{\"status\":\"OK\",\"hostname\":\"";
  inputString += hostname;
  inputString += "\",\"build\":";
  inputString += build;
  inputString += ",\"hardware\":\"";
  inputString += hardware;
  inputString += "\",\"sensors\":[";

  bool firstSensor = true;
  for (uint8_t i = 0; i < 8; i++) {
    if (temperatureValues[i] == 0) continue;
    if (!firstSensor) inputString += ",";
    inputString += "{\"sensor\":\"";
    inputString += temperatureAddresses[i];
    inputString += "\",\"value\":";
    inputString += String(temperatureValues[i]);
    inputString += ",\"type\":\"temp\"}";
    firstSensor = false;
  }

  inputString += "]";

  if (pendingResponses.length() > 0) {
    inputString += ",\"responses\":[";
    inputString += pendingResponses;
    inputString += "]";
    pendingResponses = "";
  }

  inputString += "}";

  byte plain[inputString.length() + 1];
  inputString.getBytes(plain, inputString.length() + 1);
  des.calc_size_n_pad(sizeof(plain));

  byte encodedByte[des.get_size()];
  byte plain_p[des.get_size()];
  des.padPlaintext(plain, plain_p);
  for (int i = 0; i < (des.get_size() / 8); i++) {
    byte intermitInput[8];
    byte intermitResult[8];
    for (int j = 0; j < 8; j++) {
      intermitInput[j] = plain_p[(i * 8) + j];
    }
    des.encrypt(intermitResult, intermitInput, (byte*)key);
    for (int j = 0; j < 8; j++) {
      encodedByte[(i * 8) + j] = intermitResult[j];
    }
  }

  int inputLength = sizeof(encodedByte);
  int newLength = Base64.encodedLength(inputLength);
  encoded = (char*) malloc(newLength + 1);
  encoded[newLength] = '[=11=]';

  // Base64 Encoder
  Base64.encode(encoded, (char*)encodedByte, inputLength);
  return newLength;
}

您正在按值encoded传递

char* encoded;
int contentLength = generateData(encoded);

这意味着当你在 generateData()

中分配它时
encoded = (char*) malloc(newLength + 1);
encoded[newLength] = '[=11=]';

您只更改了一个局部变量。
最快的解决方法是更改​​ generateData() 以通过引用而不是值获取其参数,它应该可以工作

int generateData(char* &encoded)

杰克的想法应该可行。

但另一个想法是制作一个包含 char *int(或 size_t)和 return 的结构。那么你不需要通过指针或引用参数尝试“return”任何东西。