我正在ESP32和路由器之间建立wifi连接。 ESP32的结构包含所有wifi配置的详细信息,其中两个是SSID和密码。如果尝试使用变量,则无法设置这两个值。
如果我使用#define定义我想要的字符串,它将起作用。...sta是保存配置参数的结构,sta与另一个结构合并为wifi_config_t的数据类型。...ssid和密码为类型为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;
但是我试图做到这一点,以便可以在运行时更改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 = {
^
我知道这是类型不匹配,但是我一生都无法弄清楚如何使变量版本与#define版本具有相同的效果!
答案 0 :(得分:5)
您的代码无法编译的原因是from tabula import read_pdf
df = read_pdf("C:\\Users\\Downloads\\abc.pdf", multiple_tables=True,pages="1-2")
df
dataList = []
for link in soup.find_all('p'):
dataList.append(link.text)
import csv
print(len(dataList ))
import pandas as pd
from pandas import DataFrame
df = DataFrame(dataList, columns= ["Para"])
df.to_csv("c:\\users\\downloads\\abc.csv")
结构中的ssid
元素是 array 类型-只能从字符串文字中初始化数组或用大括号括起来的列表。有关说明,请参见here。您正试图从另一个数组变量中初始化它-这是非法的。
例如,以下初始化是合法的。
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'};
因为char ESP_SSID[32] = "My WiFi";
// won't work - ESP_SSID is not a string literal
char ssid[32] = ESP_SSID; // ILLEGAL
不是常量表达式。
This answer(关于SO的类似问题)提供了更多示例。
请注意
ESP_SSID
与
相同#define ESP_SSID "AccessPoint"
// etc.
char ssid[32] = ESP_SSID;
也就是说,在预处理阶段,char ssid[32] = "AccessPoint";
代码中的所有实例都被替换为字符串文字ESP_SSID
。这就是为什么对您的应用程序使用"AccessPoint"
的原因-您只是使用字符串文字初始化数组。
如果要在运行时更新SSID和密码,一种选择是在启动时对阵列进行零初始化-然后根据需要使用#define
更新值。
strcpy()
请注意,由于ESP IDF生成过程中使用了编译选项,因此必须将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);
强制转换为uint8_t *
。
答案 1 :(得分:0)
出现这些错误的原因是因为您将Console.WriteLine(string.Format("{0,-10}{1,-10}{2,-15}{3,-15}",
"Id", "Ref", "Filename", "UploadDate"));
foreach (var group in groupSkip3)
{
Console.WriteLine();
foreach(var record in group)
{
Console.WriteLine(string.Format("{0,-10}{1,-10}{2,-15}{3,-15}",
record.Id, record.Ref, record.Filename, record.UploadDate.ToString("yyyy-MM-dd")));
}
}
定义为char ESP_SSID[32]
,而结构将字段定义为char[]
。这些是不同的指针(uint8_t []
与char *
)。
如果将ESP_SSID声明更新为uint8_t *
,警告将消失。
在ESP32代码中,我们uint8_t ESP_SSID[32]
进入需要字符串的字段,strcpy
进入需要二进制数据的字段,例如memcpy
。