Arduino错误:从';常量字符*';至';字符*';[-fpermissive]

Arduino错误:从';常量字符*';至';字符*';[-fpermissive],arduino,Arduino,我在柏拉图米奥身上发现了这个错误 src\main.cpp:在函数“void loop()”中: src\main.cpp:56:38:错误:从“const char*”到“char*”的转换无效[-fppermissive] static char msg=str_out.c_str(); ^ ***[.pio\build\esp01\src\main.cpp.o]错误1 ==============================================[失败]耗时3.48秒====

我在柏拉图米奥身上发现了这个错误

src\main.cpp:在函数“void loop()”中: src\main.cpp:56:38:错误:从“const char*”到“char*”的转换无效[-fppermissive] static char msg=str_out.c_str(); ^ ***[.pio\build\esp01\src\main.cpp.o]错误1 ==============================================[失败]耗时3.48秒==========================/ 433 MHz射频模块发射机BME280 */

#包括
#包括
#包括
#包括
#包括
#定义海平面压力(1013.25)
Adafruit_BME280 bme;//I2C
浮动嗡嗡声;//以百分比为单位存储湿度值
浮动温度;//将温度值存储在Celcius中
浮动压力机;//存储压力值
//定义输出字符串
字符串stru_;
字符串struu temp;
弦式压力机;
串出;
//创建振幅偏移关键帧对象
右询问右右驱动;
无效设置()
{
Serial.begin(9600);
串行打印LN(F(“BME280测试”);
布尔状态;
//初始化ASK对象
rf_driver.init();
//启动BME传感器
状态=bme.begin(0x76);
如果(!状态)
{
Serial.println(“找不到有效的BME280传感器,请检查接线!”);
而(1),;
}
}
void循环()
{
延迟(2000);//延迟使传感器稳定
hum=bme.read湿度();//获取湿度值
temp=bme.readTemperature();//获取温度值
press=bme.readPressure();//获取压力
//将湿度转换为字符串
str_潮湿=字符串(嗡嗡声);
//将温度转换为字符串
str_temp=字符串(temp);
//转换压力机
str_press=字符串(press);
//结合湿度和温度
str_out=str_潮湿+”,“+str_温度+”,“+str_压力;
//合成输出字符
静态字符*msg=str_out.c_str();
射频驱动程序发送((uint8_t*)消息,strlen(消息));
rf_驱动程序。waitPacketSent();
}
String.c_str()
返回一个
const char*
数组,该数组与您的
静态char*msg
不兼容

查看您的代码,与其为了使用字符串连接而将浮点转换为字符串,然后再转换为数组,不如直接使用字符串创建一个char数组

字符串连接在Arduino中是不安全的,因为Arduino只有2k内存,应该尽可能避免,特别是如果您对Arduino编程不熟悉,并且不熟悉动态内存分配在内部的工作方式。

String.c_str()
返回一个
常量字符*
数组,与您的
静态字符*msg
不兼容

查看您的代码,与其为了使用字符串连接而将浮点转换为字符串,然后再转换为数组,不如直接使用字符串创建一个char数组


<>字符串连接不安全,在只有2K内存的ARDUNO中应该避免,特别是如果您是新的ARDUIO编程,不熟悉动态内存分配是如何工作的。C++中使用< >代码> const <代码>访问安全。它是为了通知任何访问
常量的人,他们不应该弄乱数据,并防止您无意中修改数据
String.c_str()
返回一个
const char*
,它是
字符串的基础数据,不应修改。您正在尝试将此指针的值分配给一个
char*
,您可以修改它的内容。只需将其设置为
const char*msg
,而不是
static char*msg
<代码>静态意味着它的值在每个函数的运行中都是相同的。这里有类似的问题:C++中使用了代码> const < /C> >以访问安全性。它是为了通知任何访问
常量的人,他们不应该弄乱数据,并防止您无意中修改数据
String.c_str()
返回一个
const char*
,它是
字符串的基础数据,不应修改。您正在尝试将此指针的值分配给一个
char*
,您可以修改它的内容。只需将其设置为
const char*msg
,而不是
static char*msg
<代码>静态
意味着它的值在函数的每次运行中都是相同的。这里有一个类似的问题:
#include <RH_ASK.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C
float hum;    // Stores humidity value in percent
float temp;   // Stores temperature value in Celcius
float press; // Stores pressor value
// Define output strings

String str_humid;
String str_temp;
String str_press;
String str_out;
// Create Amplitude Shift Keying Object
RH_ASK rf_driver;

void setup() 
{
    Serial.begin(9600);
    Serial.println(F("BME280 test"));
    bool status;
    // Initialize ASK Object
    rf_driver.init();
    // Start BME Sensor
    status = bme.begin(0x76);
   if (!status) 
   {
     Serial.println("Could not find a valid BME280 sensor, check wiring!");
     while (1);
   }
}

void loop()
{
  delay(2000);  // Delay so sensor can stabalize
    hum = bme.readHumidity();  // Get Humidity value
    temp= bme.readTemperature();  // Get Temperature value
    press= bme.readPressure(); //Get Pressoure
    // Convert Humidity to string
    str_humid = String(hum);
    // Convert Temperature to string
    str_temp = String(temp);
    //Convert  Pressessor
    str_press = String (press);
    // Combine Humidity and Temperature
    str_out = str_humid + "," + str_temp + "," + str_press;
    // Compose output character
    static char *msg = str_out.c_str();
    rf_driver.send((uint8_t *)msg, strlen(msg));
    rf_driver.waitPacketSent();
}
hum = bme.readHumidity();  // Get Humidity value
temp= bme.readTemperature();  // Get Temperature value
press= bme.readPressure(); //Get Pressoure
char msg[50];
sprintf(msg, "%f,%f,%f", hum, temp, press);