char,const char char * MQTT client.publish的数组问题

时间:2018-02-19 22:47:35

标签: c++ arrays arduino char c-strings

我正在使用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*和两者的数组感到非常困惑。 client.publish仅限于上面的参数readingVal的仅字符串(!!!)。错误消息是:

  

从'char'无效转换为'char *'[-fpermissive]

1 个答案:

答案 0 :(得分:1)

正如其他人在评论中暗示的那样,阅读一些Arduino教程并不会有什么坏处。如果你不熟悉c“字符串”,你一定要试着避开它们。

String类实际上是为那些不熟悉c / c ++的人创建的。你似乎知道Arduino语言真的只是c ++,但是他们试图为那些不熟悉它的人简化事情。

如果你没有使用c / c ++,那么

dtostrf()是一个相当复杂的函数。例如,最后一个参数应该是一个“缓冲区”,大到足以保存转换结果。在您的示例中,您传递的指针根本没有分配给它的内存。你可以使用String来避免这种情况。

String允许您执行以下操作(来自教程here

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

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

someFunctionNeedingACharArray(stringOne.c_str()); 

c_str()方法将String转换为c / c ++样式char *“string”

希望这有帮助。