Arduino(C ++)使用float数组连接Char *数组

时间:2018-02-22 23:30:04

标签: c++ string char

好的,所以我有一组连接到ESP8266 WiFi SoC的传感器,它将使用浮点数填充数组。然后,我需要在通过MQTT客户端发布之前将其与mqtt主题数组连接起来。我已经创建了一个简单的骨骼草图,如下所示尝试解决数组/字符操作的问题:

#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,这表明缓冲区正在填充无限变量。请有人能给我一些关于我哪里出错的指示。

请不要烤我。我是一名业余编码员,只是想学习,我已经花了一周的时间在谷歌上搜索这个作为自助,但已经遇到障碍。

1 个答案:

答案 0 :(得分:0)

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];