问题描述
我正在尝试使用 M5StickCPlus 连接到我的 wifi。我使用platformIO框架。我收到此错误:错误:编译时从 'const char*' 到 'char*' 的无效转换。
代码如下:
#include "M5StickCPlus.h"
#include <WiFi.h>
const char* WIFI_SSID = "router";
const char* WIFI_PASS = "pass";
void setup() {
M5.begin(true,true,true);
Serial.printf("Connecting to %s ",WIFI_SSID);
WiFi.begin(WIFI_SSID,WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("CONNECTED");
}
我还尝试使用 #define 声明 SSID 和密码。但是,我遇到了另一个错误:addApbChangeCallback(): duplicate func=400EAB44 arg=3FFBF008 during execution.
我错过了什么?
解决方法
采用两个参数(一个 SSID 和一个密码)的 WiFi.begin()
函数重载要求第一个参数是一个 非常量 char*
指针(即指向一个可能可修改的 char
数组,即使函数实际上并没有改变它)。
解决此问题的一个简单方法(类似于 example given in the documentation)是将您的 WIFI_SSID
变量重新声明为这样的数组,并使用字符串文字的副本对其进行初始化。 (您也可以对 WIFI_PASS
参数执行相同操作,但这不是必需,因为 begin()
的第二个参数是 const char*
。):
char WIFI_SSID[] = "router"; // Change to a non-const char array
const char* WIFI_PASS = "pass"; // You can leave this one as-is
注意:该 begin()
重载的声明,如 this GitHub repo,是:
int begin(char* ssid,const char *passphrase);
在 C++ 中不允许从 const
指针隐式转换为非常量指针;您可以在当前定义中使用 const_cast<char*>(WIFI_SSID)
但是,恕我直言,这是一种不太理想的方法 - 出于某种原因,该参数将被定义为非常量,即使该原因是不明显!