ESP32使用ESPAsyncServer报错:'HTML' is not captured 求助
ESP32 AsyncWebServer编译错误分析与解决
错误原因
- Lambda表达式未捕获外部变量:你在
server.on中使用的空捕获列表[]的Lambda函数,无法访问外部定义的HTML变量,编译器因此抛出'HTML' is not captured错误。 - PROGMEM使用方式错误:
String类是动态内存分配的对象,不能直接用PROGMEM修饰。PROGMEM仅适用于静态常量C风格字符串(const char*),用来将数据存储到ESP32的Flash程序存储器中,你的写法不仅无效,还会导致数据存储异常。 - 额外问题:你的HTML字符串中的JS代码存在拼写错误——
fucntion应为function,addEventListner应为addEventListener,这些会导致前端WebSocket逻辑失效。
解决建议
1. 修正PROGMEM存储方式
将String类型的HTML改为静态常量C风格字符串,使用原始字符串字面量简化编写,同时正确添加PROGMEM修饰:
const char HTML[] PROGMEM = R"rawliteral( <!DOCTYPE html> <html> <head> <title> Helixis </title> <script> let gateway = `ws:${window.location.hostname}/ws` function initWS(){ console.log('Connection to WebSocket ... ') let ws = new WebSocket(gateway) ws.onopen = onOpen ws.onclose = onClose ws.onmessage = onMessage } function onOpen(){ console.log('Succesfully connected to the WebSocket') } function onClose(){ console.log('WebSocket connection closed') } function onMessage(e){ console.log(e==1 ? `On` : `Off`) } function onLoad(){ initWS() } window.addEventListener('load',onLoad) </script> </head> </html> )rawliteral";
2. 修正Lambda表达式与响应发送
由于HTML现在是全局静态常量,Lambda函数可直接访问,无需额外捕获。同时将响应的Content-Type改为text/html(之前的text/plain会让浏览器以纯文本展示HTML):
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { request->send_P(200, "text/html", HTML); });
3. (可选)如果HTML是局部变量的捕获方式
若HTML是局部定义的变量,需在Lambda捕获列表中添加变量,比如使用值捕获[HTML]或引用捕获[&HTML]:
// 假设HTML是局部const char* PROGMEM变量 server.on("/", HTTP_GET, [HTML](AsyncWebServerRequest *request) { request->send_P(200, "text/html", HTML); });
内容的提问来源于stack exchange,提问作者Divyansh undley
相关产品推荐
相关产品推荐

