在 Arduino IDE 中从 int 到 char* 的转换无效
Invalid conversion from int to char* in Arduino IDE
我尝试使用 ESP 01 编写 CO2 传感器代码,每 10 秒将 ppm 值发布到 MQTT Broker。除了发布部分,一切正常。我总是收到一个错误,告诉我无法将 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);
}
}
有一个传感器返回的数字,还有一个指向您要用来存储它的字符的指针。指针未初始化且指向任何地方(好吧,它是一个全局变量,所以它指向地址 0,但可以是任何东西)。
您正在尝试使用传感器返回的一些“几乎”随机数来更改该位置。这是不允许的(不是没有明确的类型转换 - 在这种情况下“是的,我想朝自己的脑袋开枪”)。
快速解决方法是将 char* sCO2;
更改为 String sCO2;
,因为字符串 class 实现了 uint16_t 的赋值。并且打印函数可以处理打印String类型变量。
缓慢修复正在使用 char sCO2[6];
// 应该足够大以存储 0..65535 + 零终止字符,您必须将该无符号整数转换为 char 数组中的 space。它基本上使用函数 utoa(value, sCO2, 10);
(10 是结果字符串的基数 - 又名 decadic)
我尝试使用 ESP 01 编写 CO2 传感器代码,每 10 秒将 ppm 值发布到 MQTT Broker。除了发布部分,一切正常。我总是收到一个错误,告诉我无法将 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);
}
}
有一个传感器返回的数字,还有一个指向您要用来存储它的字符的指针。指针未初始化且指向任何地方(好吧,它是一个全局变量,所以它指向地址 0,但可以是任何东西)。
您正在尝试使用传感器返回的一些“几乎”随机数来更改该位置。这是不允许的(不是没有明确的类型转换 - 在这种情况下“是的,我想朝自己的脑袋开枪”)。
快速解决方法是将 char* sCO2;
更改为 String sCO2;
,因为字符串 class 实现了 uint16_t 的赋值。并且打印函数可以处理打印String类型变量。
缓慢修复正在使用 char sCO2[6];
// 应该足够大以存储 0..65535 + 零终止字符,您必须将该无符号整数转换为 char 数组中的 space。它基本上使用函数 utoa(value, sCO2, 10);
(10 是结果字符串的基数 - 又名 decadic)