pha*_*rrr 2 c int pointers type-conversion esp32
我正在ESP32和路由器之间建立wifi连接。ESP32的结构包含所有wifi配置的详细信息,其中两个是SSID和密码。如果尝试使用变量,则无法设置这两个。
如果我使用#define定义了想要的字符串,它将起作用。...sta是保存配置参数的结构,sta与另一个结构合并为wifi_config_t的数据类型。...ssid和password的类型为uint8_t
//These work
#define ESP_SSID "AccessPoint"
#define ESP_PASS "Pass"
//These don't work
char ESP_SSID[32] = "AccessPoint" //32 since that's max SSID length
char ESP_PASS[64] = "Pass" //64 since that's max pass length
//...later in code...
wifi_config_t wifi_config = {
.sta = {
.ssid = ESP_SSID,
.password = ESP_PASS
},
};
//...definition of .sta ...
typedef struct {
uint8_t ssid[32];
uint8_t password[64];
...
} wifi_sta_config_t;
Run Code Online (Sandbox Code Playgroud)
但是我正在尝试使其能够在运行时更改SSID和Pass,这就是为什么要设置变量的原因。但是,如果我使用变量版本,则会导致以下错误:
warning: initialization makes integer from pointer without a cast [-Wint-conversion]
.ssid = ESP_SSID,
^
warning: initialization makes integer from pointer without a cast [-Wint-conversion]
.password = ESP_PASS
^
error:missing braces around initializer [-Werror=missing-braces]
.sta = {
^
Run Code Online (Sandbox Code Playgroud)
我知道这是一次类型缺失匹配,但是我无法终生弄清楚如何使变量版本与#define版本具有相同的效果!
您的代码无法编译的原因是结构中的ssid元素wifi_config_sta_t是数组类型-只能从字符串文字或括号括起来的列表中初始化数组。请参阅此处以获取解释。您正在尝试从另一个数组变量初始化它-这是非法的。
例如,以下初始化是合法的。
char ssid1[32] = "My WiFi"; // from string literal -> okay
// from brace-enclosed list -> okay
char ssid2[32] = {'M', 'y', ' ', 'W', 'i', 'F', 'i'};
Run Code Online (Sandbox Code Playgroud)
另一方面,这不是:
char ESP_SSID[32] = "My WiFi";
// won't work - ESP_SSID is not a string literal
char ssid[32] = ESP_SSID; // ILLEGAL
Run Code Online (Sandbox Code Playgroud)
因为ESP_SSID不是常量表达式。
SO上类似问题的答案给出了更多示例。
注意
#define ESP_SSID "AccessPoint"
// etc.
char ssid[32] = ESP_SSID;
Run Code Online (Sandbox Code Playgroud)
是相同的
char ssid[32] = "AccessPoint";
Run Code Online (Sandbox Code Playgroud)
即,在的代码阶段内的所有实例在预处理阶段ESP_SSID都将替换为字符串文字"AccessPoint"。这就是#define为您的应用程序使用作品的原因-您只是使用字符串文字初始化数组。
如果要在运行时更新SSID和密码,一种选择是在启动时对阵列进行零初始化-然后strcpy()根据需要用于更新值。
wifi_config_t wifi_config = {0}; // Zero initialize all struct memberes
strcpy((char *)wifi_config.sta.ssid, ESP_SSID);
strcpy((char *)wifi_config.sta.password, ESP_PASS);
Run Code Online (Sandbox Code Playgroud)
请注意,这是必要的铸uint8_t *到char *,由于ESP IDF构建过程中使用的编译选项。