You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32使用ESPAsyncServer报错:'HTML' is not captured 求助

ESP32 AsyncWebServer编译错误分析与解决

错误原因

  1. Lambda表达式未捕获外部变量:你在server.on中使用的空捕获列表[]的Lambda函数,无法访问外部定义的HTML变量,编译器因此抛出'HTML' is not captured错误。
  2. PROGMEM使用方式错误:String类是动态内存分配的对象,不能直接用PROGMEM修饰。PROGMEM仅适用于静态常量C风格字符串(const char*),用来将数据存储到ESP32的Flash程序存储器中,你的写法不仅无效,还会导致数据存储异常。
  3. 额外问题:你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 02:50:38