【问题标题】:Invalid conversion from int to char* in Arduino IDEArduino IDE 中从 int 到 char* 的无效转换
【发布时间】:2020-11-13 13:58:30
【问题描述】:

我尝试使用 ESP 01 编写 CO2 传感器,它每 10 秒将 ppm 值发布到 MQTT 代理。除发布部分外,一切正常。我总是收到一个错误,告诉我我无法将 int 转换为 char*。我尝试了很多东西,但没有任何效果。

你能帮帮我吗?如果您需要任何额外信息,请尽管询问。

这是错误获取:

Arduino: 1.8.13 (Windows 10), Board: "Generic ESP8266 Module, 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), dtr (aka nodemcu), 26 MHz, 40MHz, DOUT (compatible), 1MB (FS:64KB OTA:~470KB), 2, nonos-sdk 2.2.1+100 (190703), v2 Lower Memory, Disabled, None, Only Sketch, 115200"





















C:\Users\sevis\Desktop\co2 - Kopie\co2\co2.ino: In function 'void loop()':

co2:53:26: error: invalid conversion from 'uint16_t {aka short unsigned int}' to 'char*' [-fpermissive]

     sCO2 = sensor.getCO2();

                          ^

exit status 1

invalid conversion from 'uint16_t {aka short unsigned int}' to 'char*' [-fpermissive]



This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

代码如下:

#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#include <Adafruit_MQTT_FONA.h>
#include <Wire.h>
#include "SparkFunCCS811.h"

#define CCS_ADDR 0x5B

#define AIO_SERVER      "192.168.1.123"
#define AIO_SERVERPORT  1883
#define AIO_USERNAME    "****"
#define AIO_KEY         "**********"

char* sCO2;
int timer;

CCS811 sensor(CCS_ADDR);

WiFiManager wifiManager;

WiFiClient client;

Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

void setup() {
    Wire.begin(0, 2);
    Serial.begin(9600);
    
    wifiManager.autoConnect("AutoConnectAP");
    Serial.println("Wifi connected!");
    
    MQTT_connect();

    while(sensor.begin() == false) {
    Serial.println("No Sensor");
    mqtt.publish("Raum1_co2", "No Sensor");
    delay(5000);
  }
}

void loop() {
  MQTT_connect();
  
  //mqtt.publish("Raum1_co2", "1050");
  
  if (sensor.dataAvailable()) {
    sensor.readAlgorithmResults();

    sCO2 = sensor.getCO2();
    mqtt.publish("Raum1/CO2", sCO2);
    Serial.print(sCO2);
    Serial.println("ppm : Data published");
  }
  delay(10000);
}

void MQTT_connect() {
  int8_t ret;

  // Stop if already connected.
  if (mqtt.connected()) {
    return;
  }
  while (mqtt.connect()) {
       mqtt.disconnect();
       delay(5000);
  }
}

【问题讨论】:

    标签: arduino arduino-esp8266


    【解决方案1】:

    传感器返回一个数字,并且有一个指向您要用来存储它的字符的指针。指针未初始化且不指向任何地方(嗯,它是一个全局变量,所以它指向地址 0,但可以有任何东西)。

    您正在尝试使用传感器返回的一些“几乎”随机数来更改该位置。这是不允许的(不是没有明确的类型转换——在这种情况下“是的,我想把自己射到头上”)。

    快速解决方法是将char* sCO2; 更改为String sCO2;,因为 String 类实现了来自 uint16_t 的赋值。而 print 函数可以处理打印 String 类型的变量。

    慢速修复是使用char sCO2[6]; // 应该足够大以存储 0..65535 + 零终止字符,并且您必须将该无符号整数转换为 char 数组中的该空间。它基本上使用函数utoa(value, sCO2, 10);(10 是结果字符串的基数 - 又名十进制)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 2014-05-18
      • 2019-12-07
      • 2019-09-22
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 2012-03-30
      相关资源
      最近更新 更多