【发布时间】:2019-12-19 23:07:40
【问题描述】:
我想在我的 ESP8285 的闪存/EEPROM 上存储 WiFi 凭据和一些其他配置。
我将从网络服务器输入字段接收字符串。我写了一些测试代码来确定存储和转换是否有效。事实证明不是。当我想存储 MAC 地址时,我不知道如何将 char 数组转换为字节数组并忽略一些字符,例如“:”。存储 SSID、密码和频道效果很好,但 MAC 地址不行。
这是我写入 EEPROM 时的代码 sn-p:
void writeCredentials() {
String newSSID = "WRT";
String newPass = "45568798789098794879784";
String newBSSID = "3A:79:16:A8:B5:76";
char buff[sizeof(settings.eeBSSID)];
byte mac[6];
char chBuff[3];
char *ptr;
newBSSID.toCharArray(buff, newBSSID.length() + 1);
Serial.println(buff);
ptr = strtok(buff, ":");
int index = 0;
while (ptr != NULL) {
strcpy(chBuff, ptr);
Serial.print(" Mac: ");
Serial.print(chBuff);
sscanf(&chBuff[2], "%02xd", &mac[index]); //no idea here maybe completely wrong
index++;
ptr = strtok(NULL, ":");
}
Serial.println("");
newSSID.toCharArray(settings.eeSSID, newSSID.length() + 1);
newPass.toCharArray(settings.eePass, newPass.length() + 1);
for (int i = 0; i < sizeof(mac); i++) {
Serial.println(char(mac[i]));
}
settings.eeChannel = 12345;
memcpy(settings.eeBSSID, mac, sizeof(mac));
EEPROM.put(0, settings);
Serial.println("Settings saved!");
}
出于测试目的,我将字符串放入 writeCredentials() 函数中。稍后它们将来自网络服务器文本输入表单。一切都在这样的配置结构中进行管理:
typedef struct WiFi_Settings {
char eeSSID[32];
char eePass[32];
byte eeBSSID[6];
int eeChannel;
};
WiFi_Settings settings {
"",
"",
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1
};
我花了几个小时将 newBSSID 转换为一个字节/uint8_t 数组,我可以将其存储在我的结构中,稍后将用于 ESP 的 WiFi.begin 函数...
用 strtok、sscanf 测试了很多变体,并尝试将 char 数组(存储在 buff 中)拆分为 2 个 char 片段的位,然后我可以将其转换为字节并将其传递给字节数组,但每次都没有工作。也许有人可以帮助我?
【问题讨论】:
-
buff需要为newBSSID.length() + 1字节长,但您将其设为sizeof(settings.eeBSSID)(即 6 个字节) -
sscanf的用法也是错误的。应该是sscanf(chBuff, "%02xd", &mac[index]); -
或者你可以这样做:
sscanf(buff, "%02xhhd:%02xhhd:%02xhhd:%02xhhd:%02xhhd:%02xhhd", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]); -
使用
sscanf(chBuff, "%02xd", &mac[index]);会立即使我的 ESP 崩溃。当我使用静态整数更改索引时,例如 0 它可以工作。我的代码有什么错误?使用sscanf(buff, "%02xhhd:%02xhhd:%02xhhd:%02xhhd:%02xhhd:%02xhhd", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);只存储第一个字节。在我的答案中查看我更新的代码。 -
请看我的其他评论。我又把格式说明符弄混了!正确的是
%02hhx,但这也可能不起作用。在嵌入式平台sscanf实现可能是部分的。您必须检查 Espressif SDK。
标签: c++ arduino esp8266 arduino-esp8266