【问题标题】:char, const char char* array issues for MQTT client.publishMQTT client.publish 的 char、const char char* 数组问题
【发布时间】:2018-07-30 05:30:16
【问题描述】:

我正在使用 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 仅限于字符串 (!!!)。错误信息是:

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

【问题讨论】:

  • 你为什么不使用 Arduino String 类?为什么readingVal 的类型是char,当您要在其中存储一个字符串 时?你认为char* topic = "ESPlant/" + sensorIDArray[i] 会如何工作?
  • char* topic = "ESPlant/" + sensorIDArray[i]; -- 这不会在 C++ 中进行连接。老实说,您的问题与 MQTT、Arduino 或任何其他除了、简单、基本的 C++ 无关,您可以在任何教科书中找到。
  • 我开始走String类的路线,但它似乎变得越来越复杂,你能举个例子吗?我希望该主题是位置 0 的例如 ESPlant/ 和 DS18B20_1 的串联。因此整个主题将显示为:ESPlant/DS18B20_1
  • PaulMkenzie,非常感谢您的评论。我不是唯一一个发现这个网站非常不受欢迎的人。请问有人可以帮助我做一些建设性的事情吗?谢谢。
  • @EdwardHammock C++ 不是 JavaScript 或 Python。您有两个char 指针,并且您没有使用+ 连接它们。似乎您正在尝试使用其他计算机语言作为指南来编写 C++。那永远行不通。连接字符串的正确方法是使用字符串类来表示具有重载运算符+ 的字符串,或者如果使用字符串文字和字符数组,则使用strcat。但这应该包含在任何好的 C++ 教程、书籍或网站中。

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


【解决方案1】:

正如其他人在 cmets 中所暗示的那样,阅读一些 Arduino 教程并没有什么坏处。如果您不熟悉 c“字符串”,则绝对应该尝试避开它们。

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

dtostrf() 是一个非常复杂的函数,如果你不熟悉 c/c++。例如,最后一个参数应该是一个“缓冲区”,大到足以容纳转换的结果。在您的示例中,您正在传递一个根本没有分配内存的指针。您可以使用 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"

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 2013-03-20
    • 2014-07-17
    相关资源
    最近更新 更多