1. 项目概述从“联网小能手”到“智能节点”的蜕变说起给传统设备加上联网功能ESP8266-01S这个模块绝对是绕不开的“明星选手”。它体积小巧价格低廉却集成了完整的Wi-Fi和TCP/IP协议栈让一个普通的单片机瞬间变身“物联网终端”。我最早接触它是在一个智能插座项目里当时市面上能选择的Wi-Fi模块不多ESP8266的出现简直是降维打击。它不像一些传统的串口转Wi-Fi模块那样需要复杂的AT指令交互和外部MCU来管理网络连接其内置的Tensilica L106 32位微处理器让它本身就具备了一定的独立处理能力。你可以把它简单地当成一个串口透传模块用AT指令控制也可以深度开发在上面直接跑用户程序实现复杂的逻辑。这种灵活性是它迅速风靡创客圈和工业领域的根本原因。ESP-01S作为ESP8266家族中非常经典的一款以其极致的紧凑设计和亲民的价格成为了无数嵌入式开发者的“启蒙模块”。无论是你想做一个远程控制的小车一个环境数据采集器还是一个简单的智能开关ESP-01S几乎都是成本最优、上手最快的选择之一。它解决了传统设备“信息孤岛”的核心痛点将数据上传到云端或者接收来自手机App的指令变得前所未有的简单。这篇文章我将结合自己多年的使用和教学经验为你彻底拆解ESP8266-01S从最基础的硬件连接到两种核心开发模式AT指令与SDK开发再到与STM32等主流MCU的协同作战最后分享那些官方手册里不会写的实战避坑指南。无论你是刚入门的嵌入式新手还是想寻找一个可靠联网方案的工程师相信都能在这里找到你需要的东西。2. 核心硬件解析与上手准备2.1 模块引脚定义与电源门道ESP-01S模块的引脚排列非常简洁总共8个引脚2x4排针但每一个都至关重要接错了轻则不工作重则烧毁模块。VCC 和 GND这是最需要小心的地方。ESP8266-01S的工作电压是3.3V绝对不允许接入5V我见过不止一个初学者因为习惯性地从Arduino的5V引脚取电导致模块瞬间冒烟。推荐使用AMS1117-3.3或LM1117-3.3这类LDO稳压芯片从5V电源稳定降压到3.3V为其供电。同时ESP8266在发射Wi-Fi信号时峰值电流可能超过200mA所以你的3.3V电源必须能提供至少300mA的持续电流并且电源线要尽量短粗靠近模块VCC引脚处最好并联一个100uF的电解电容和一个0.1uF的瓷片电容以应对瞬间的大电流需求。CH_PD (EN)芯片使能引脚高电平有效。这个引脚必须接3.3V或通过一个10K电阻上拉到3.3V模块才能正常工作。如果它被拉低模块将进入关机模式。GPIO0 和 GPIO2这两个引脚在模块启动时的电平状态决定了它的启动模式这是第一个容易踩坑的地方。正常启动模式运行用户程序GPIO0 1 (高电平或悬空) GPIO2 1 (高电平内部已上拉通常悬空即可)。下载模式烧录固件GPIO0 0 (接地)。在需要刷写AT固件或自己编译的固件时必须让模块在此模式下启动然后通过串口进行烧录。RST复位引脚低电平有效。通常通过一个10K电阻上拉到3.3V。需要手动复位时可以瞬间将其接地。RX/TX串口通信引脚电平是3.3V TTL。连接其他MCU如STM32时务必注意电平匹配。STM32的引脚如果是5V容忍的虽然可能不会烧坏但3.3V的“高电平”可能达不到STM32的识别阈值导致通信失败。最稳妥的方式是使用电平转换芯片或者在STM32端使用其本身的3.3V供电IO口STM32F103系列IO口多为5V容忍但输出高电平为3.3V直接连接ESP-01S的RX通常可行但ESP-01S的TX接STM32的RX时需确认STM32的该IO口支持3.3V输入识别。GPIO16这个引脚在ESP-01S上没有引出但内部连接到了RTC常用于深度睡眠模式下的定时唤醒。实操心得一上电顺序与电源噪声很多莫名其妙的启动失败、系统重启问题根源都在电源。除了保证电流足够上电时序也很关键。确保CH_PD和VCC几乎同时上电或者CH_PD稍晚于VCC上电。避免CH_PD还处于低电平时VCC已经供电这可能导致内部状态错乱。另外如果使用开关电源其高频噪声可能会干扰ESP8266敏感的射频电路导致Wi-Fi连接不稳定。在电源入口处增加一个π型滤波电路如10uH电感两个10uF电容能极大改善这种情况。2.2 最小系统搭建与串口调试要让ESP-01S跑起来你需要准备以下东西一个稳定的3.3V/500mA电源如前所述可以用USB转TTL工具上的3.3V输出需确认其带载能力或者独立的LDO模块。USB转TTL串口工具这是调试和通信的桥梁。推荐使用CP2102、CH340等芯片的方案稳定且驱动好找。连接线若干杜邦线。接线方法用于AT指令调试USB转TTL的3.3V- ESP-01S的VCCUSB转TTL的GND- ESP-01S的GNDUSB转TTL的TX- ESP-01S的RXUSB转TTL的RX- ESP-01S的TX将ESP-01S的CH_PD通过一个10K电阻连接到VCC或直接接VCC。确保GPIO0和GPIO2悬空内部上拉为高电平此时模块将启动到“正常运行模式”。连接好后打开串口调试助手如XCOM、SSCOM、Putty等设置波特率为115200大多数出厂固件默认值数据位8停止位1无校验。给模块上电在串口助手中应该能看到一串以“ready”结尾的启动信息。如果没看到首先检查电源和接线然后尝试按一下RST键复位。此时在发送区输入AT并回车如果模块回复OK那么恭喜你最小系统工作正常可以开始AT指令之旅了。如果没反应可能是固件问题或波特率不对可以尝试其他常见波特率如9600、74880等。3. 两种核心开发模式深度解析3.1 AT指令模式快速原型与MCU协处理器AT指令模式是使用ESP-01S最快捷的方式。在这种模式下ESP-01S相当于一个“黑盒”Wi-Fi协处理器。主控MCU如STM32、Arduino、51单片机通过串口发送特定的AT指令字符串来控制ESP-01S连接Wi-Fi、创建TCP连接、收发数据等。所有复杂的网络协议处理都在ESP-01S内部完成。常用AT指令分类与实战基础测试与设置AT测试指令回复OK说明通信正常。ATRST重启模块。ATGMR查看版本信息。ATUART115200,8,1,0,0修改串口波特率等参数。注意修改后需保存重启生效ATSAVETRANSLINK不对AT指令集版本不同保存命令可能是ATSAVE且修改有风险可能导致通信失败建议初期保持115200。Wi-Fi模式配置核心ATCWMODE?查询当前Wi-Fi模式。ATCWMODE1设置为Station模式设备模式像手机一样连接路由器。ATCWMODE2设置为AP模式热点模式自己作为一个Wi-Fi热点。ATCWMODE3设置为StationAP混合模式。 对于大多数需要接入互联网的设备我们使用模式1。连接路由器ATCWJAP你的Wi-Fi名称,你的Wi-Fi密码连接指定路由器。成功会返回WIFI CONNECTED和WIFI GOT IP。ATCWJAP?查询当前连接的AP信息。ATCWLAP列出附近可用的AP列表。这个指令非常有用可以帮你检查模块的射频功能是否正常以及搜索网络环境。TCP/UDP通信ATCIPSTARTTCP,www.example.com,80建立一个到example.com 80端口的TCP连接。连接成功后返回CONNECT。ATCIPSTARTUDP,192.168.1.100,1234,1111,0建立UDP连接本地端口1111远程端口1234。ATCIPSEND4准备发送4字节数据。模块会回复此时你需要在3秒内通过串口发送实际数据如1234。ATCIPCLOSE关闭当前连接。ATCIPMUX0设置为单连接模式。1为多连接模式在需要同时处理多个客户端时使用如简易TCP服务器。透传模式 这是提高数据吞吐效率的关键。普通模式下每发送一包数据都需要先发ATCIPSEND指定长度再发数据。透传模式下一旦开启所有通过串口发送的数据都会被自动转发到当前的网络连接无需再发控制指令。ATCIPMODE1设置透传模式。先建立TCP/UDP连接ATCIPSTART。然后发送ATCIPSEND模块回复后即进入透传模式。此时主MCU只需像操作本地串口一样收发数据即可。退出透传模式发送注意不要带回车换行模块在收到后会回复一个等待约1秒后再发AT确认退出。实操心得二AT指令的“坑”与稳定性技巧指令响应与超时每条AT指令发送后一定要等待并解析其响应如OK,ERROR,SEND OK。设计你的MCU程序时必须要有超时重试机制。网络操作如连接AP、建立TCP耗时可能长达数秒。数据量与管理在非透传模式下发送数据前务必用ATCIPSEND指定准确长度。如果实际发送的数据少于指定长度模块会等待直到超时如果多于指定长度多余部分会被丢弃或导致错误。缓冲区溢出ESP8266的串口接收缓冲区有限。如果主MCU发送AT指令或数据的速度过快可能导致缓冲区溢出指令丢失。需要在MCU端做好流量控制或者使用透传模式减轻指令解析负担。电源噪声再现在进行Wi-Fi扫描或大数据量传输时如果电源质量差模块可能重启。此时观察串口日志如果看到一堆乱码后跟着“ets Jan 8 2013...”的启动信息基本可以断定是电源问题。3.2 SDK开发模式释放芯片全部潜能当你觉得AT指令模式效率不够高、控制不够灵活或者想节省掉另一个主控MCU的成本时SDK开发模式就是你的选择。此时你将在ESP8266本体的芯片上直接编程使用乐鑫官方提供的SDK软件开发工具包或者基于SDK的二次开发框架如Arduino for ESP8266、ESP-IDF的早期版本、NodeMCU的Lua固件等。开发环境搭建以Arduino IDE为例最易上手安装Arduino IDE。在“文件”-“首选项”的“附加开发板管理器网址”中添加https://arduino.esp8266.com/stable/package_esp8266com_index.json。打开“工具”-“开发板”-“开发板管理器”搜索“esp8266”安装“esp8266 by ESP8266 Community”。安装完成后在开发板中选择“Generic ESP8266 Module”。对于ESP-01S需要手动设置以下参数Flash Mode:DOUT(非常重要ESP-01S的Flash通常是DOUT模式)Flash Size:1MB (FS:64KB OTA:~470KB)(ESP-01S通常是1MB Flash)Upload Speed:115200CPU Frequency:80 MHzReset Method:ckDebug Level:NonePort: 选择你的USB转TTL端口程序架构与核心功能 在Arduino框架下编程逻辑和标准Arduino非常相似但多了强大的Wi-Fi和网络库。#include ESP8266WiFi.h const char* ssid 你的Wi-Fi; const char* password 你的密码; void setup() { Serial.begin(115200); delay(100); // 连接Wi-Fi WiFi.begin(ssid, password); Serial.print(Connecting to ); Serial.print(ssid); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } Serial.println(\nConnected! IP address: ); Serial.println(WiFi.localIP()); // 这里可以初始化Web服务器、MQTT客户端、传感器等 // 例如server.begin(); } void loop() { // 主循环处理网络事件、传感器读取等 // 例如handleClient(); }模式切换 在SDK中你可以轻松实现模式的动态切换这是AT指令模式难以做到的。#include ESP8266WiFi.h void setup() { Serial.begin(115200); // 1. 设置为Station模式并连接路由器 WiFi.mode(WIFI_STA); WiFi.begin(ssid_sta, password_sta); // 2. 同时开启一个AP热点 // WiFi.softAP(MyESP_AP, ap_password); // 如果需要混合模式取消注释 // 3. 扫描周边Wi-Fi (Station模式下) int n WiFi.scanNetworks(); for (int i 0; i n; i) { Serial.printf(%d: %s (%d) %s\n, i1, WiFi.SSID(i).c_str(), WiFi.RSSI(i), (WiFi.encryptionType(i) ENC_TYPE_NONE)? :*); } }优势对比特性AT指令模式SDK开发模式开发难度低只需串口通信中需要嵌入式C/C基础灵活性较低受限于指令集极高可自由实现任何逻辑性能一般指令解析有开销高直接操作硬件和协议栈成本需额外主控MCU仅需ESP模块本身成本最低功能上限基础联网、透传可做Web服务器、MQTT客户端、文件系统操作等适用场景快速验证、作为现有产品的联网附加功能独立的物联网终端、需要复杂逻辑的设备4. 与STM32的协同开发实战在很多产品级项目中ESP8266-01S作为联网单元STM32作为主控处理业务逻辑是一种非常经典的架构。STM32负责采集传感器数据、控制执行器、处理复杂算法然后通过串口将需要上报的数据或需要执行的网络指令交给ESP-01S。4.1 硬件连接与电平匹配如前所述最可靠的连接方式是使用电平转换芯片如TXS0108E、74LVC4245等。如果为了简化设计也可以采用以下方法STM32 TX - ESP-01S RXSTM32的IO口输出高电平为3.3V可以直接连接。ESP-01S TX - STM32 RX这里需要小心。如果STM32的该RX引脚是5V容忍的可以尝试直接连接。但为了稳定最好在ESP-01S的TX引脚和STM32的RX引脚之间串联一个330Ω - 1kΩ的电阻起到限流和轻微电平匹配的作用。更优的方案是使用一个简单的分压电路或者直接用MOS管搭建一个单向电平转换电路。推荐连接示意图无电平转换芯片STM32F103C8T6 (3.3V供电) ESP-01S 3.3V ---------------- VCC GND ---------------- GND PA9 (TX) ------------ RX (可串联330Ω电阻) PA10(RX) ------------ TX (此路建议加电平转换或分压) PC13 (GPIO) -------- CH_PD (控制模块使能) PC14 (GPIO) -------- RST (可选用于硬复位) PC15 (GPIO) -------- GPIO0 (用于控制启动模式下载固件时拉低)在STM32端将连接ESP-01S RX的引脚如PA10设置为浮空输入或上拉输入模式。4.2 软件驱动设计状态机与协议解析在STM32上驱动ESP-01S本质上是设计一个健壮的串口通信协议解析器。绝对要避免使用while循环死等某个响应这会导致整个系统阻塞。正确的做法是使用状态机State Machine。1. 定义通信状态typedef enum { ESP_STATE_IDLE, // 空闲 ESP_STATE_CMD_SENT, // 指令已发送等待响应 ESP_STATE_WAIT_FOR_IP, // 等待获取IP ESP_STATE_TCP_CONNECTING,// TCP连接中 ESP_STATE_TCP_SENDING, // 发送数据中 ESP_STATE_TCP_RECEIVING, // 接收数据中 } ESP8266_State_t;2. 串口中断接收 在STM32的串口接收中断服务函数中将收到的字符存入一个环形缓冲区Ring Buffer。// 假设使用USART1 void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) { uint8_t ch USART_ReceiveData(USART1); ring_buffer_write(esp_rx_buf, ch); // 写入环形缓冲区 USART_ClearITPendingBit(USART1, USART_IT_RXNE); } }3. 主循环状态机处理 在主循环或一个低优先级任务中不断从环形缓冲区读取数据并根据当前状态进行解析。void ESP8266_Process(void) { static char response_buffer[256]; static int resp_idx 0; while(ring_buffer_available(esp_rx_buf) 0) { char c ring_buffer_read(esp_rx_buf); response_buffer[resp_idx] c; // 检查是否收到一行完整的响应以\n结尾 if(c \n) { response_buffer[resp_idx] \0; // 字符串终结 resp_idx 0; // 解析响应 if(strstr(response_buffer, OK) ! NULL) { // 根据当前状态机状态进行状态转移 switch(esp_current_state) { case ESP_STATE_CMD_SENT: if(strstr(last_sent_cmd, CWJAP) ! NULL) { esp_current_state ESP_STATE_WAIT_FOR_IP; } else if(strstr(last_sent_cmd, CIPSTART) ! NULL) { esp_current_state ESP_STATE_TCP_CONNECTING; } // ... 其他指令响应处理 break; case ESP_STATE_WAIT_FOR_IP: if(strstr(response_buffer, GOT IP)) { esp_current_state ESP_STATE_IDLE; printf(Wi-Fi Connected with IP.\n); } break; // ... 其他状态处理 } } else if(strstr(response_buffer, ERROR) ! NULL) { // 错误处理记录日志根据策略重试或进入错误状态 printf(ESP Error: %s, response_buffer); esp_current_state ESP_STATE_IDLE; // 或错误状态 } else if(strstr(response_buffer, IPD) ! NULL) { // 收到网络数据格式如IPD,len:data // 解析长度和数据存入应用层数据缓冲区 parse_ipd_data(response_buffer); } } // 防止缓冲区溢出 if(resp_idx sizeof(response_buffer) - 1) { resp_idx 0; // 丢弃旧数据或处理错误 } } // 状态机超时处理 if(esp_current_state ! ESP_STATE_IDLE) { if((HAL_GetTick() - state_entry_tick) STATE_TIMEOUT_MS) { printf(ESP State %d Timeout!\n, esp_current_state); esp_current_state ESP_STATE_IDLE; // 可以触发重试逻辑 } } }4. 发送指令函数void ESP8266_SendCmd(const char* cmd) { // 清空接收缓冲区准备接收新响应 ring_buffer_clear(esp_rx_buf); resp_idx 0; // 保存发送的指令用于后续响应匹配简易处理 strncpy(last_sent_cmd, cmd, sizeof(last_sent_cmd)-1); // 通过串口发送指令末尾加\r\n HAL_UART_Transmit(huart1, (uint8_t*)cmd, strlen(cmd), 100); HAL_UART_Transmit(huart1, (uint8_t*)\r\n, 2, 100); // 更新状态机和超时计时器 esp_current_state ESP_STATE_CMD_SENT; state_entry_tick HAL_GetTick(); }4.3 数据通信协议设计STM32和ESP-01S之间除了AT指令更需要一套应用层协议来高效、可靠地交换数据。例如当STM32需要ESP-01S向服务器api.example.com:80发送一个温度值25.6时如果只用原始AT指令流程是STM32发送:ATCIPSTARTTCP,api.example.com,80等待CONNECT和OKSTM32发送:ATCIPSEND4等待STM32发送:25.6等待SEND OK这个过程繁琐且容易出错。更好的方法是设计一个简单的封装协议。例如定义一个帧结构[帧头 0xAA][命令字][数据长度 L][数据域...][校验和]命令字0x01表示“连接服务器”0x02表示“发送数据”0x03表示“进入透传”等。数据域对于“连接服务器”命令数据域可以是TCP,api.example.com,80对于“发送数据”命令数据域就是实际要发送的负载。STM32只需要按照这个帧格式组包发给ESP-01S。ESP-01S端运行一个自定义的固件基于SDK开发该固件解析这个自定义协议然后内部调用对应的AT指令或SDK API去执行网络操作最后将结果成功/失败、接收到的网络数据再按照同样的协议格式打包回传给STM32。这样STM32的代码变得极其简洁只需关注业务逻辑和协议封装网络细节完全由ESP-01S上的定制固件处理稳定性和可维护性大大提升。这也是很多商业Wi-Fi模块的做法。5. 典型应用场景与进阶玩法5.1 智能家居传感器节点这是ESP-01S最典型的应用。连接一个DHT11温湿度传感器通过Wi-Fi定期将数据上报到MQTT服务器如EMQX、Mosquitto或HTTP服务器如Home Assistant的API。硬件ESP-01S DHT11仅需一个GPIOESP-01S的GPIO2可用。软件使用Arduino框架集成PubSubClient库实现MQTT或ESP8266HTTPClient库实现HTTP POST。关键点低功耗设计如果使用电池供电需要启用ESP8266的深度睡眠模式。在发送完数据后调用ESP.deepSleep(30e6)睡眠30秒。注意深度睡眠下只有RTC电路和GPIO16保持工作需要将GPIO16连接到RST引脚来实现定时唤醒。ESP-01S模块本身可能没有引出GPIO16需要自行飞线或选择其他型号。断线重连在网络不稳定的环境中必须在代码中实现Wi-Fi和MQTT的断线检测与自动重连机制。通常在主循环中检查连接状态如果断开则尝试重新初始化连接。数据缓存在发送失败时可以考虑将数据暂存到SPIFFS文件系统如果固件支持中待网络恢复后重发。5.2 简易TCP/UDP调试工具或数据透传中继利用ESP-01S的APStation混合模式可以构建一个有趣的中继。例如让ESP-01S连接到家里的路由器Station模式同时自己又开一个热点AP模式。手机连接到ESP-01S的热点然后通过一个简单的Socket调试App就可以经由ESP-01S转发与互联网上的服务器通信。这相当于一个微型的、可编程的无线串口服务器/网络调试助手。5.3 结合云平台实现远程控制除了自己搭建服务器利用现有的物联网云平台如阿里云IoT、腾讯云IoT、OneNET、Blynk等可以快速实现设备上云。这些平台通常提供了针对ESP8266的SDK或示例代码。流程设备上电 - 连接Wi-Fi - 根据平台要求进行认证三元组/动态注册- 建立长连接MQTT居多- 订阅主题接收指令 - 发布主题上传数据。优势省去了服务器运维、安全加固TLS/DTLS、协议设计等复杂工作可以专注于设备端和应用端的开发。注意云平台SDK通常较大需要关注ESP-01S的1MB Flash空间是否足够。可能需要对SDK进行裁剪或者选择更轻量级的平台接入方案。6. 常见问题排查与避坑指南以下是我在项目和教学中遇到的高频问题汇总问题现象可能原因排查步骤与解决方案上电无任何反应串口无输出1. 电源问题电压/电流不足2. CH_PD未拉高3. 模块损坏1. 用万用表测量VCC和GND间电压稳定在3.3V。测量上电瞬间电流。2. 确认CH_PD引脚通过电阻上拉或直接连接到3.3V。3. 替换模块测试。发送AT指令无OK回复1. 波特率不对2. TX/RX接反3. 固件丢失或损坏1. 尝试常见波特率115200, 9600, 74880, 57600。2. 检查接线。3. 尝试进入下载模式GPIO0拉低重启刷写AT固件。能收到OK但Wi-Fi连接失败1. 密码错误2. Wi-Fi名称有特殊字符或中文3. 路由器加密方式不支持如WPA34. 信号太弱1. 仔细核对密码。2. 将路由器SSID改为纯英文数字。3. 尝试将路由器加密方式改为WPA2-PSK。4. 使用ATCWLAP指令查看信号强度确保RSSI值大于-70。TCP连接失败1. 网络未连接未获取IP2. 目标地址/端口错误3. 服务器防火墙阻止4. DNS解析失败1. 先用ATCIFSR查看是否获得IP。2. 用电脑ping一下目标域名或IP用网络调试助手连接目标端口测试。3. 检查服务器端设置。4. 尝试使用IP地址而非域名连接。透传模式无法退出1.发送格式不对1. 确保发送时前后各有至少1秒的静默时间不发送任何数据。2. 有些固件要求后不跟任何字符直接等待。数据传输不稳定丢包1. 电源干扰2. 串口波特率过高或误差大3. 缓冲区溢出4. 网络环境差1. 加强电源滤波模块远离干扰源。2. 降低波特率到9600或19200测试。3. 在STM32端增加流控或降低发送频率。4. 靠近路由器测试。刷写固件失败1. 未进入下载模式GPIO0未拉低2. 串口工具驱动/引脚冲突3. Flash模式选择错误4. 复位时序不对1. 确认上电前GPIO0已接地上电后看到串口有乱码输出即进入下载模式。2. 关闭所有可能占用串口的软件尝试不同的USB口。3. 对于ESP-01SFlash Mode务必选择DOUT。4. 有些烧录工具需要控制RST引脚按照工具说明操作。使用SDK开发程序运行不稳定经常重启1. 看门狗超时2. 内存分配失败堆碎片3. 中断服务程序执行时间过长4. 电源问题再次强调1. 在loop()函数或长时间任务中定期调用ESP.wdtFeed()喂狗。2. 避免频繁动态分配内存malloc/new使用静态或池分配。3. 优化ISR只做标记复杂处理放到主循环。4. 这是最常见的原因用示波器观察电源引脚波形。最后的经验之谈ESP8266-01S是一个极其强大且经受了市场考验的模块它的稳定性建立在正确的硬件设计和严谨的软件逻辑之上。多数问题都源于电源、时序和代码健壮性。在项目初期多花时间在电源电路设计和基础通信测试上后期会省去大量的调试时间。当你熟悉了它的“脾气”它就会成为你手中连接物理世界与数字世界最得心应手的工具之一。对于想要深入学习的开发者我建议在掌握AT指令和Arduino框架后可以去研究一下乐鑫官方的ESP-IDF虽然对ESP8266支持已停止但原理相通或Non-OS SDK你会对底层机制有更深刻的理解从而写出更高效、更稳定的代码。