Arduino(C )condenate char*阵列与float数组

Arduino (C++) concatenate Char* array with float array

本文关键字:阵列 float 数组 char condenate Arduino      更新时间:2023-10-16

好吧,所以我有一组传感器连接到ESP8266 WiFi SOC,该传感器将填充带有浮子的数组。然后,在通过MQTT客户端发布之前,我需要将其与一系列MQTT主题相连。我创建了一个裸露的骨头草图,如下所示,以尝试解决数组/char操作的问题:

#include <ESP8266WiFi.h>
float readingsArray[10]; //Store the sensor readings
float reading; // Current reading 
char* mqttPackage; // The concatenated output.
char* sensorIDArray[] = { // Used for the MQTT topic string
  "DS18B20_1",
  "DS18B20_2",
  "DS18B20_3",
  "DHT22_t",
  "DHT22_h",
  "Hygrometer_1",
  "Hygrometer_2",
  "Hygrometer_3",
  "Hygrometer_4",
  "Battery"
};
void setup(){
  Serial.begin(9600);
  for (int i = 0; i < 10; i++){ // Populate the readingsArray with dummy data.
    reading = random(0, 100);
    Serial.print("Reading: ");
    Serial.println(reading);
    readingsArray[i] = reading;
    delay(100);
  }
  Serial.print("readingsArray full");
  for (int i = 0; i < 10; i++){
    strcpy(mqttPackage, sensorIDArray[i]);     // copy topic to mqttPackage
    String tempStr = String(readingsArray[i]); // string from sensor float
    char* newChar;                             // I THINK THIS IS THE OFFENDING VARIABLE
    tempStr.toCharArray(newChar, tempStr.length() + 1); // string to char array
    strcat(mqttPackage, newChar);              // concatenate the chars to mqttPackage
    Serial.print("Element ");                  // Debug print the output.
    Serial.print(i);
    Serial.print(": ");
    Serial.println(mqttPackage);
    delay(100);
  }  
}

我正在从ESP8266中获得错误29,这表明缓冲区充满了无限变量。请有人可以给我一些关于我出错的事情的指示。

请不要烤我。我是一个业余编码器,只是想学习,我从字面上花了一个星期的晚上将其作为自助搜索,但遇到了一个障碍。

String::toCharArrayString对象管理的字符复制到提供的缓冲区中。您将newChar作为输出缓冲区传递,但并未指向您可以写入的任何内存。您需要分配一个可以将字符串写入的缓冲区:

char newChar[100] = {};
tempStr.toCharArray(newChar, 99); // 99 so we can't overwrite the last nul character

请注意,如果tempStr长于99 char s,则第一个99将写入newChar

您的strcpystrcat呼叫共享相同的问题。他们希望填充用户提供的缓冲区,但是您通过的指针并没有指向任何东西。


实际上没有任何舞蹈。String直接支持串联,因此您可以做

之类的事情
String mqttPackage = sensorIDArray[i];
mqttPackage += readingsArray[i];

当然,您实际上根本不需要将内存中的值限制,因为您只是将它们打印到串行端口。您可以直接打印它们,让Serial库担心将其转换

Serial.print("Element ");
Serial.print(i);
Serial.print(": ");
Serial.print(sensorIDArray[i]);
Serial.println(readingsArray[i];