【发布时间】:2017-02-06 02:02:58
【问题描述】:
我遇到了一个奇怪的行为。我正在使用 ESP8266 arduino SPIFFS 来存储配置设置。这是mycode的相关部分;
void loop()
{
handleUartRxOk();
}
void handleUartRxOk() {
String cmd;
char charBuff[3200];
char char_print[50];
static bool terminatorReceived = false;
char incomingChar = 0; // for incoming serial data
if (Serial.available()) {
incomingChar = Serial.read();
saveChar(incomingChar);
if (incomingChar == '\r') {
terminatorReceived = true;
}
if (terminatorReceived) {
buffer[buffer_index - 1] = '\0';
cmd = String(buffer);
if (cmd == "XXX") {
ConfigSettings.ssid = "SSID_XX";
ConfigSettings.password = "PASSWORD_XX";
saveConfig();
}
buffer_index = 0;
terminatorReceived = false;
}
}
}
在上面的代码中,UART 将收到一个命令“XXX\r”,然后运行 saveConfig() 将配置参数 ssid 和参数保存到 SPIFSS。在我添加更多完全不相关的代码之前,此代码运行良好。
这就是新代码的样子。
void handleUartRxOk() {
String cmd;
char charBuff[3200];
char char_print[50];
static bool terminatorReceived = false;
char incomingChar = 0; // for incoming serial data
if (Serial.available()) {
incomingChar = Serial.read();
saveChar(incomingChar);
if (incomingChar == '\r') {
terminatorReceived = true;
}
if (terminatorReceived) {
buffer[buffer_index - 1] = '\0';
cmd = String(buffer);
if (cmd == "XXX") {
ConfigSettings.ssid = "SSID_XX";
ConfigSettings.password = "PASSWORD_XX";
saveConfig();
}
//Why does adding this else statement cause saveConfig() to crash when run?
else {
strcat(charBuff, cmd.c_str());
}
buffer_index = 0;
terminatorReceived = false;
}
}
}
添加额外的else子句后,向UART发送“XXX\r”并导致saveConfig()会导致异常错误。这令人费解,因为新代码甚至都没有运行。
异常错误如下;
Exception (3):
epc1=0x401002f0 epc2=0x00000000 epc3=0x00000000 excvaddr=0x400072f6 depc=0x00000
000
ctx: sys
sp: 3fff06b0 end: 3fffffb0 offset: 01a0
【问题讨论】:
-
谁在这里增加buffer_index?
-
未在相关代码中显示。在别处实施。
-
将 charBuff 定义为 arduino 字符串,并对 cat 使用运算符重载:charBuff += cmd。您的代码有几个不安全的部分,所以请使用上层 api。
标签: arduino filesystems esp8266 arduino-esp8266 spiffs