好的,所以我有一组连接到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,这表明缓冲区正在填充无限变量。请有人能给我一些关于我哪里出错的指示。
请不要烤我。我是一名业余编码员,只是想学习,我已经花了一周的时间在谷歌上搜索这个作为自助,但已经遇到障碍。
答案 0 :(得分:0)
String::toCharArray
将String
对象管理的字符复制到提供的缓冲区中。您正在传递newChar
作为输出缓冲区,但它没有指向您可以写入的任何内存。您需要分配一个可以将字符串写入的缓冲区:
char newChar[100] = {};
tempStr.toCharArray(newChar, 99); // 99 so we can't overwrite the last nul character
请注意,如果tempStr
超过99 char
s,则前99个将被写入newChar
。
您的strcpy
和strcat
来电分享同一问题。他们希望填充用户提供的缓冲区,但是你传递的指针并不指向任何东西。
但这种舞蹈实际上并不是必需的。 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];