2016-09-28 33 views
0

我遇到了一个奇怪的行为。我正在使用ESP8266 arduino SPIFFS来存储配置设置。这是mycode的相关部分;添加无关代码后,SPIFSS代码崩溃

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子句,发送 “XXX \ r” 把UART和造成saveconfig的()后,会引起异常错误。这是令人费解的,因为新代码甚至无法运行。

异常错误如下;

Exception (3): 

epc1=0x401002f0 epc2=0x00000000 epc3=0x00000000 excvaddr=0x400072f6 depc=0x00000 
000 

ctx: sys 

sp: 3fff06b0 end: 3fffffb0 offset: 01a0 
+0

谁在这里增加buffer_index? – cagdas

+0

未在相关代码中显示。在其他地方实施。 – user781486

+0

将charBuff定义为arduino字符串并使用运算符重载到cat:charBuff + = cmd。你的代码有几个不安全的部分,所以使用高级别的API。 – cagdas

回答

2

声明char charBuff[3200];全球,而不是一个函数内部。 Arduino ESP8266的默认堆栈大小约为4k。您的数组大小有可能导致溢出。尝试一下,看看它是否有效。我以前遇到过类似的问题。它为我工作。

默认堆栈大小可以位于存储器的限度内由下核/ esp8266修改cont.h被升高/

编辑:约缺省堆栈大小的修改信息被丹尼尔爪牙在给予。

+1

已验证是正确答案。它现在有效。 – user781486

+2

堆栈大小不是4K的_maximum_,它是默认大小。你可以通过在核心/ esp8266/core下修改cont.h来达到你想要的高度(当然在内存限制内) –