首页 > 解决方案 > 如何在我使用的 arduino 库之一中修复构造函数中的转换错误

问题描述

我试图让两个 LoRa-esp32 相互通信,但我的“MASTER”需要将从“SLAVE”接收到的传感器上的读数发送到我的 MQTT 服务器(使用 io.adafruit)。而且由于某种原因,我无法将数据发送到 MQTT 服务器。我尝试了一切,但我不明白为什么会这样。

我阅读了函数的 .h 构造函数,但我似乎不明白这有什么问题。

这是我发布功能的代码:

if (! Text1.publish(msg)) {
  Serial.println(F("Failed"));
} else {
  Serial.println(F("OK!"));
}

这是对应的Adafruit_MQTT.h lib代码:

class Adafruit_MQTT_Publish {
 public:
  Adafruit_MQTT_Publish(Adafruit_MQTT *mqttserver, const char *feed, uint8_t qos = 0);

  bool publish(const char *s);
  bool publish(double f, uint8_t precision=2);  // Precision controls the minimum number of digits after decimal.
                                                // This might be ignored and a higher precision value sent.
  bool publish(int32_t i);
  bool publish(uint32_t i);
  bool publish(uint8_t *b, uint16_t bLen);


private:
  Adafruit_MQTT *mqtt;
  const char *topic;
  uint8_t qos;
};

这是我得到的错误:

大师:189:42:错误:初始化时无法将“字符串”转换为“常量字符*”

const char *msg = createJsonString();

退出状态 1 无法在初始化中将 'String' 转换为 'const char*'

编辑

如评论中要求将 Master:168 中的代码添加到 Master:202

void receive(){
  //Tentamos ler o pacote
  int packetSize = LoRa.parsePacket();

  //Verificamos se o pacote tem o tamanho mínimo de caracteres que esperamos
  if (packetSize > SETDATA.length()){
    String received = "";
    //Armazena os dados do pacote em uma string
    for(int i=0; i<SETDATA.length(); i++){
      received += (char) LoRa.read();
    }

    //Se o cabeçalho é o que esperamos
    if(received.equals(SETDATA)){
      //Fazemos a leitura dos dados
      LoRa.readBytes((uint8_t*)&data, sizeof(data));
      //Mostramos os dados no display
      showData();

      Serial.print("Publish message: ");
      //Criamos o json que enviaremos para o server mqtt
      const char *msg = createJsonString();
      Serial.println(msg);
      //Publicamos no tópico onde o servidor espera para receber 
      //e gerar o gráfico
      //client.publish(TOPIC_NAME, msg.c_str());
      //#define TOPIC_NAME "iot-2/evt/status/fmt/json"
         if (! Text1.publish(msg)) {
          Serial.println(F("Failed"));
        } else {
          Serial.println(F("OK!"));
        }
    }
  }
}

标签: c++arduinomqttesp32

解决方案


它确实看起来像类型不匹配。根据编译器错误,createJsonString() 返回一个字符串对象。在 C++ 中,这字符数组不同。我建议您花点时间熟悉一下 std::string,将 msg 转换为建议的字符串对象(如 jxh)并使用 c_str() 函数来访问字符数组。

字符串对象的良好描述


推荐阅读