【问题标题】:ESP8266 exception (3)ESP8266 异常(三)
【发布时间】:2020-03-20 12:45:58
【问题描述】:

我将 ESP8266 用作带有 Arduino IDE 的 Web 服务器。 ESP8266 提供 HTML 网页并在接收 POST 请求时更改 GPIO 输出。下面的代码运行良好。

  • Arduino IDE:适用于 Linux 的 1.8.11
  • ESP8266:ESP-01
  • ESP8266核心版本: 2.6.2

附言index.h 只是一个包含PAGE_INDEX 的文件,它是 HTML 页面的字符串。

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include "index.h"

#define OUT_PIN1 2
#define OUT_PIN2 0

const char ssid[] = "********";
const char pass[] = "********";

ESP8266WebServer server(80); // Run a web server on port 80

// handaling the request of main page
void rootRouter() {
  server.send (200, "text/html", PAGE_INDEX );
}

void setup() {
  pinMode(OUT_PIN1, OUTPUT);
  pinMode(OUT_PIN2, OUTPUT);
  Serial.begin(115200);

  // Connecting to wifi
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("WiFi connected, IP: ");
  Serial.println(WiFi.localIP());  // print the ip

  // the main page
  server.on ( "/", rootRouter);
  // page for switch 1
  server.on ("/sw1", []() {
     String state = server.arg("led");
     if (state == "ON") {
         digitalWrite(OUT_PIN1, HIGH);
     } else if (state == "OFF") {
         digitalWrite(OUT_PIN1, LOW);
     }

     Serial.print("OUT_PIN1: ");
     Serial.println(state);
  });
  // page for switch 2
  server.on ("/sw2", []() {
     String state = server.arg("led");
     if (state == "ON") {
         digitalWrite(OUT_PIN2, HIGH);
     } else if (state == "OFF") {
         digitalWrite(OUT_PIN2, LOW);
     }

     Serial.print("OUT_PIN2: ");
     Serial.println(state);
  });
  // For page not found
  server.onNotFound([](){
    server.send(404, "text/plain", "404 NOT found!");
  });

  server.begin();
  Serial.println("HTTP server started.");
}

void loop() {
    server.handleClient(); // handaling requests
}

但是,当我修改部分代码时。我得到了例外(3)。 我在下面的代码中修改了什么:

  1. 再添加一页 /sw 以更改两个 GPIO 的输出。
  2. 删除一些Serial.print()
  3. 收到 POST 请求时发送 204 响应。

我修改的代码:

#include <ESP8266WebServer.h>
#include <ESP8266WiFi.h>

#include "index.h"

#define OUT_PIN1 2
#define OUT_PIN2 0

const char ssid[] = "********";
const char pass[] = "********";

ESP8266WebServer server(80);  // Run a web server on port 80

// handaling the request of main page
void rootRouter() { server.send(200, "text/html", PAGE_INDEX); }

void setup() {
  pinMode(OUT_PIN1, OUTPUT);
  pinMode(OUT_PIN2, OUTPUT);
  Serial.begin(115200);

  // Connecting to wifi
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("WiFi connected, IP: ");
  Serial.println(WiFi.localIP());  // print the ip

  // the main page
  server.on("/", rootRouter);

  // This is the page I add
  server.on("/sw", []() {
    String state = server.arg("led");
    if (state == "ON") {
      digitalWrite(OUT_PIN1, HIGH);
      digitalWrite(OUT_PIN2, HIGH);
    } else if (state == "OFF") {
      digitalWrite(OUT_PIN1, LOW);
      digitalWrite(OUT_PIN2, LOW);
    }
    server.send(204);
  });
  // page for switch 1
  server.on("/sw1", []() {
    String state = server.arg("led");
    if (state == "ON") {
      digitalWrite(OUT_PIN1, HIGH);
    } else if (state == "OFF") {
      digitalWrite(OUT_PIN1, LOW);
    }
    server.send(204);
  });
  // page for switch 2
  server.on("/sw2", []() {
    String state = server.arg("led");
    if (state == "ON") {
      digitalWrite(OUT_PIN2, HIGH);
    } else if (state == "OFF") {
      digitalWrite(OUT_PIN2, LOW);
    }
    server.send(204);
  });
  // For page not found
  server.onNotFound([]() { server.send(404, "text/plain", "404 NOT found!"); });

  server.begin();
  Serial.println("HTTP server started.");
}

void loop() {
  server.handleClient();  // handaling requests
}

错误:

Exception (3):
epc1=0x40100794 epc2=0x00000000 epc3=0x00000000 excvaddr=0x4006ead9 depc=0x00000000

>>>stack>>>

ctx: cont
sp: 3ffffb50 end: 3fffffc0 offset: 01a0
3ffffcf0:  00000000 feefeffe feefeffe feefeffe  
3ffffd00:  401027d4 00080000 feefeffe 3ffffeb0  
3ffffd10:  0000049c 0000049c 00000020 40100984  
3ffffd20:  feefeffe 2c9f0300 4000050c 3fffc278  
3ffffd30:  00000000 400042db 000000fe 40100bdc  
3ffffd40:  40004b31 00001000 000000fe 401002f8  
3ffffd50:  40105c74 00000001 3ffef850 40232b29  
3ffffd60:  40105e31 40232c13 3ffef854 0000049c  
3ffffd70:  000000fd 3ffffeb0 3ffef854 40232bf6  
3ffffd80:  ffffff01 55aa55aa 00000011 00000020  
3ffffd90:  00000020 0000006d 0000006d aa55aa55  
3ffffda0:  000000ff 402330f6 3ffef854 3ffef854  
3ffffdb0:  000000ff 000001ae 000001ae 401006c4  
3ffffdc0:  40105e31 00000001 3ffef864 40233316  
3ffffdd0:  00000005 3ffef854 000000ff 3ffffeb0  
3ffffde0:  3ffffed0 3ffef88b 00000011 00000020  
3ffffdf0:  3ffef914 3fffff11 00000001 402333c6  
3ffffe00:  3ffffeb0 4023f750 00000000 00000008  
3ffffe10:  3ffefc54 3ffffed0 3fff5b8c 40233395  
3ffffe20:  3ffef854 402333fc 3ffe84cc 3ffe868e  
3ffffe30:  40204302 3ffe868e 3ffe8685 40204257  
3ffffe40:  69676e65 645f656e 5f6d726f 47342e32  
3ffffe50:  40007a48 feefeffe feefeffe feefeffe  
3ffffe60:  30323230 24234021 3ffef700 40207a07  
3ffffe70:  0000001c 0001c200 00000000 00000000  
3ffffe80:  00000003 40207bc9 ffffffff 00000001  
3ffffe90:  feefeffe 00000001 3ffee4a4 3ffee520  
3ffffea0:  1b327800 fea4bec5 feefeffe 00000100  
3ffffeb0:  69676e65 645f656e 5f6d726f 47342e32  
3ffffec0:  40007a48 feefeffe feefeffe feefeffe  
3ffffed0:  30323230 24234021 3ffef700 40207afb  
3ffffee0:  0000001c 0001c200 00000000 00000000  
3ffffef0:  00000003 40207cbd ffffffff 00000001  
3fffff00:  feefeffe 00000001 3ffee494 3ffee510  
3fffff10:  00000000 00000001 3ffee481 00000002  
3fffff20:  00000004 00000000 3ffee45c 00000001  
3fffff30:  0001c200 0000001c 00000000 3ffee510  
3fffff40:  3ffee494 00000000 3ffee45c 40201b1c  
3fffff50:  feefeffe feefeffe feefeffe feefeffe  
3fffff60:  feefeffe feefeffe feefeffe feefeffe  
3fffff70:  feefeffe feefeffe feefeffe feefeffe  
3fffff80:  feefeffe feefeffe feefeffe feefeffe  
3fffff90:  feefeffe feefeffe feefeffe 3ffee510  
3fffffa0:  3fffdad0 00000000 3ffee4d0 40206a00  
3fffffb0:  feefeffe feefeffe 3ffe84e8 40100c11  
<<<stack<<<

 ets Jan  8 2013,rst cause:4, boot mode:(1,6)

wdt reset

 ets Jan  8 2013,rst cause:4, boot mode:(1,6)

wdt reset

我也尝试只添加一个我只提到一次的功能,但总是得到异常 (3) 错误。

【问题讨论】:

  • 想象一下有人会如何处理这个问题。我自己的例子:我将把它加载到实际的硬件或模拟器中,看看会发生什么。由于不提供完整和最少的代码,你会让每个人都更难帮助你。该异常不是很有帮助,因为没有与之关联的调试信息,因此需要一些时间来对其进行注释以使其有用。请提供使用的 Arduino IDE 版本,以及用于编译该代码的确切工具/板。并请最小化代码。从字面上删除任何不会重现错误的内容。
  • 感谢您的评论。我只是更新环境细节。我对提问还是很陌生,对 esp8266 也不是很熟悉。我试图将代码上传到芯片,但异常不断出现。我会尽量提供连击代码示例~

标签: c arduino esp8266


【解决方案1】:

调试的一般步骤:
用固定的 char 数组替换您的 String 类。
将简单的 200 响应发送回浏览器 - 这最适合测试

 server.send(200,"text/plain","");

添加串行打印以进行调试和
如果您只想处理 POST,请确保使用

server.on("/sw", HTTP_POST,  []() 
 Serial.println("Debug: /sw started");
 ... do something ...
 Serial.println("Debug: /sw finished");
 )

分析通过 Web 开发人员控制台在浏览器中发送的内容和接收的内容(如果有的话)。
如需进一步帮助,请列出您的环境 ArduinoIDE 1.8.12 和 esp8266 内核的版本(最新为 20.3.2020 版本 2.6.2),以及发送和接收的请求标头。
另一个提示:异常 3 是超出范围的写入,到现在为止(请参阅问题 #1997 - 已关闭但未完全解决 - 在 esp8266 存储库中)所以提到您将索引页面存储在闪存中,请尝试完全擦除:
在 Arduino IDE 中: 将工具/擦除闪存更改为“所有闪存内容”一次 闪现草图。 然后将其设置回“仅草图” 阅读问题以了解更多原因和可能的解决方案。

要反对选民 - 离开 - 至少 - 评论一下你会做什么。

【讨论】:

  • 有效!我将擦除闪存选项更改为“所有闪存内容”,一切都变得正常。谢谢你的建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
相关资源
最近更新 更多