2016-09-28 66 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來達到你想要的高度(當然在內存限制內) –