char,const char*阵列问题,用于mqtt client.publish



我正在使用Arduino IDE来编程ESP8266,该ESP8266连接到许多传感器。最终目标是通过MQTT发布传感器数据。

我有一个带有传感器名称的数组:

const char* sensorIDArray[] = { // Used for the MQTT string
  "DS18B20_1",
  "DS18B20_2",
  "DS18B20_3",
  "DHT22_t",
  "DHT22_h",
  "Hygrometer_1",
  "Hygrometer_1",
  "Hygrometer_1",
  "Hygrometer_1",
  "Battery"
};

我有另一个带有一些传感器读数的数组:

float readingsArray[10]; //Saving the last measurement
/* Array element reminder:
 *
 * readingsArray[0] = DS18B20_1
 * readingsArray[1] = DS18B20_2
 * readingsArray[2] = DS18B20_3
 * readingsArray[3] = DHT22_t
 * readingsArray[4] = DHT22_h
 * readingsArray[5] = Hygrometer_1
 * readingsArray[6] = Hygrometer_2
 * readingsArray[7] = Hygrometer_3
 * readingsArray[8] = Hygrometer_4
 * readingsArray[9] = Battery
 */

然后,我试图通过循环浏览数组的每个元素来将读数发送到MQTT客户端:

char readingVal;
for (int i = 0; i<10; i++) {
    dtostrf(readingsArray[i], 7, 2, readingVal); //convert float to string
    char* topic = "ESPlant/" + sensorIDArray[i]; //concatenate MQTT topic
    client.publish(topic, readingVal);  //publish MQTT topic and sensor reading
    delay(10); //delay to ease burden on MQTT server.
}  

我是C 和Arduino的新手。尽管有很多小时的谷歌搜索,但我对charchar*和两者的数组感到非常困惑。对于上面的参数readingValclient.publish仅限于字符串(!!!(。错误消息是:

从" char"转换为" char*" [-fpermissive]

正如其他人在评论中所暗示的那样,阅读一些Arduino教程不会受到伤害。如果您不熟悉C"字符串",则绝对应该尝试避开它们。

实际上是为那些真正不知道C/C 的人创建的。正如您所知道的那样如果您不在C/C 上,则

dtoStrf((是一个相当复杂的功能。例如,最后一个参数应该是"缓冲区",足够大以保持转换的结果。在您的示例中,您将通过一个指针,根本没有内存分配。您可以使用字符串避免使用。

字符串允许您仅适用于以下内容(来自此处的教程(

int sensorValue = analogRead(A0); 
String stringOne = "Sensor value: ";
String stringThree = stringOne + sensorValue;
Serial.println(stringThree);

当您达到需要将字符串传递给期望char*(c/c 字符串(的函数时,您就可以做类似的事情。

someFunctionNeedingACharArray(stringOne.c_str()); 

C_STR((方法将字符串转换为C/C 样式char*" String"

希望这会有所帮助。

最新更新