我的 esp32 M5 StickC plus 的 Wifi 无法使用

问题描述

我正在尝试使用 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) 但是,恕我直言,这是一种不太理想的方法 - 出于某种原因,该参数将被定义为非常量,即使该原因是不明显!