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

标签 c++ arrays arduino char c-strings

我正在使用 Arduino IDE 对连接到多个传感器的 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 仅限于字符串 (!!!)。错误信息是:

invalid conversion from 'char' to 'char*' [-fpermissive]

最佳答案

正如其他人在评论中暗示的那样,阅读一些 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);

当您需要将字符串传递给需要 char*(c/c++ 字符串)的函数时,您可以这样做。

someFunctionNeedingACharArray(stringOne.c_str()); 

c_str()方法将String转换成c/c++风格的char* "string"

希望这对您有所帮助。

关于c++ - MQTT client.publish 的 char, const char char* 数组问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48875335/

相关文章:

c++ - 无法在 Release 模式下在 Qt 中加载 QSQLCIPHER

用于 C、C#、C++ 和 Java 的 C# 代码分析器。

c++ - 将数组传递给类函数 C++

c++ - 运行英特尔线程构建模块的 XCode 8 环境变量是什么

jquery - 如何使用 jQuery 从数组中的元素中检索值?

android - Arduino数字引脚高低输出似乎颠倒了

c++ - Arduino:字符串连接困难

java - 如何从java中的json文件中获取value中的特定值?

java连接数组中的元素

python - 使机器人指向正确的方向