ESP8266 WIFI模块使用详解 目录一、硬件平台二、ESP8266模块简介三、硬件连接四、ESP8266模块仿真电路连接五、ESP8266模块的串口配置ESP8266模块串口配置串口接收超时检测定时器配置ESP8266模块串口相关变量定义中断服务函数ESP8266模块的串口重定向函数用于向ESP8266模块发送指令/数据六、ESP8266模块的基础AT指令使用向 ESP8266 模块发送数据发送的可以是AT 指令或透传数据向ESP8266模块发送 AT 指令并等待其应答检查 ESP8266 模块返回数据中是否包含指定应答字符串ESP8266 模块的基础AT指令七、配置ESP8266模块为STA模式八、配置ESP8266模块为AP模式九、配置ESP8266模块的TCP单连接十、配置ESP8266模块的TCP多连接十一、配置ESP8266模块的UDP单连接十二、配置ESP8266模块的UDP多连接十三、配置ESP8266模块的TCP透传十四、配置ESP8266模块的UDP透传十五、配置 ESP8266模块进入透传模式完整流程十六、配置ESP8266模块退出透传模式一、硬件平台STM32F103C8主控芯片、STM32F407主控芯片、ESP8266 Wi-Fi模块二、ESP8266模块简介ESP8266 Wi-Fi模块 功能串口转Wi-Fi支持通过AT指令配置TCP/UDP透传。 接口TTL串口默认 1152008N1。 工作模式STA、AP、STAAP。 工作电压3.3V峰值电流 300mA建议独立供电。三、硬件连接STM32 串口资源 USART1连接PC串口助手波特率 115200输出调试日志。 USART3连接ESP8266模块通过发送AT指令和接收响应。四、ESP8266模块仿真电路连接五、ESP8266模块的串口配置ESP8266模块串口配置/** * brief 初始化USART3用于连接 ESP8266 * param bound 波特率如 115200 * details * - 引脚PB10 (TX), PB11 (RX) * - 配置8N1无流控 * - 使能接收中断 * - 初始化TIM4为10ms超时定时器用于帧结束检测 * - 初始关闭TIM4待接收到首字节再开启 */ void usart3_init(u32 bound) { NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; ​ /* 使能时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); ​ /* 复位 USART3 */ USART_DeInit(USART3); ​ /* 配置 PB10 为复用推挽输出TX */ GPIO_InitStructure.GPIO_Pin GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_Init(GPIOB, GPIO_InitStructure); ​ /* 配置 PB11 为浮空输入RX */ GPIO_InitStructure.GPIO_Pin GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, GPIO_InitStructure); ​ /* USART3 参数配置 */ USART_InitStructure.USART_BaudRate bound; USART_InitStructure.USART_WordLength USART_WordLength_8b; USART_InitStructure.USART_StopBits USART_StopBits_1; USART_InitStructure.USART_Parity USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART3, USART_InitStructure); ​ /* 使能 USART3 */ USART_Cmd(USART3, ENABLE); ​ /* 使能接收中断 */ USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); ​ /* 配置 NVIC 中断优先级 */ NVIC_InitStructure.NVIC_IRQChannel USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority 2; NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; NVIC_Init(NVIC_InitStructure); ​ /* 初始化 TIM410ms 中断用于超时检测 */ TIM4_Int_Init(100 - 1, 7200 - 1); //PSC 7199 → 72MHz / 7200 10kHz //ARR 99 → 100 * 100μs 10ms ​ USART3_RX_STA 0; //清空接收状态 TIM_Cmd(TIM4, DISABLE); //初始关闭定时器待接收首字节再开启 }串口接收超时检测定时器配置void TIM4_Int_Init(u16 arr,u16 psc) { NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; ​ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//TIM3时钟使能 //定时器TIM7初始化 TIM_TimeBaseStructure.TIM_Period arr; //在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision TIM_CKD_DIV1; //设置时钟分割:TDTS Tck_tim TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM4, TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM7中断,允许更新中断 TIM_Cmd(TIM4,ENABLE);//开启定时器7 NVIC_InitStructure.NVIC_IRQChannel TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1 ;//抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority 2; //子优先级2 NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; //IRQ通道使能 NVIC_Init(NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 }ESP8266模块串口相关变量定义#define USART3_MAX_RECV_LEN 600 // 接收缓冲区最大字节数建议 ≥512以容纳完整AT应答 #define USART3_MAX_SEND_LEN 600 // 发送缓冲区最大字节数用于u3_printf格式化输出 ​ /* USART3 接收缓冲区最大存储USART3_MAX_RECV_LEN字节 */ u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; ​ /* USART3 发送缓冲区用于 u3_printf */ u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; ​ /* * USART3 接收状态标志 * - bit15 (MSB): 帧完成标志 * 0 → 未完成正在接收或空闲 * 1 → 已接收完整一帧等待主程序处理 * - bit14~0: 当前已接收的有效字节数最大 32767 */ volatile uint16_t USART3_RX_STA 0;中断服务函数/** * brief USART3中断服务函数接收中断 * details * 1. 读取接收到的字节res * 2. **透传至 USART1**用于调试PC可通过USART1查看ESP8266返回 * 3. 若尚未完成一帧bit150 * - 将字节存入USART3_RX_BUF * - 清零TIM4计数器重置超时 * - 若是第一个字节启动TIM4开始计时 * 4. 若缓冲区满强制标记帧完成bit151 * * note * - 此设计实现 **“空闲超时”帧检测**适用于不定长AT应答 * - 透传至USART1是调试技巧方便监控ESP8266通信 */ void USART3_IRQHandler(void) { u8 res 0; ​ /* 检查是否为接收中断 */ if (USART_GetITStatus(USART3, USART_IT_RXNE) ! RESET) { USART_ClearITPendingBit(USART3, USART_IT_RXNE); //清除中断标志 ​ res USART_ReceiveData(USART3); //读取接收到的数据 ​ /* 调试透传将ESP8266数据转发到USART1 */ while (!(USART1-SR USART_FLAG_TXE)); //等待USART1发送寄存器空 USART_SendData(USART1, res); //通过USART1输出如连接 PC ​ /* 接收缓冲区管理 */ if ((USART3_RX_STA (1 15)) 0) //若尚未完成一帧 { if (USART3_RX_STA USART3_MAX_RECV_LEN) //缓冲区未满 { TIM_SetCounter(TIM4, 0); //重置TIM4计数器延长超时 ​ if (USART3_RX_STA 0) //第一个字节启动定时器 { TIM_Cmd(TIM4, ENABLE); // 启动TIM4开始10ms超时计时 } ​ USART3_RX_BUF[USART3_RX_STA] res; // 存入缓冲区 } else { USART3_RX_STA | (1 15); // 缓冲区满强制标记完成 } } } }ESP8266模块的串口重定向函数用于向ESP8266模块发送指令/数据/** * brief USART3的printf重定向函数 * param fmt 格式化字符串同标准 printf * details * - 使用vsprintf 将格式化内容写入USART3_TX_BUF * - 循环发送每个字节等待发送完成TC 标志 * - **注意**此函数为阻塞式且不支持中断发送 * * warning * - 发送内容长度不能超过USART3_MAX_SEND_LEN * - 高频调用可能阻塞系统建议仅用于调试 */ void u3_printf(char* fmt, ...) { u16 i, j; va_list ap; ​ va_start(ap, fmt); vsprintf((char*)USART3_TX_BUF, fmt, ap); //格式化到发送缓冲区 va_end(ap); ​ i strlen((const char*)USART3_TX_BUF); //获取实际长度 ​ for (j 0; j i; j) { while (USART_GetFlagStatus(USART3, USART_FLAG_TC) RESET); //等待发送完成 USART_SendData(USART3, USART3_TX_BUF[j]); } }六、ESP8266模块的基础AT指令使用向 ESP8266 模块发送数据发送的可以是AT 指令或透传数据/** * brief 向ESP8266模块发送数据发送的可以是AT 指令或透传数据 * param cmd 数据内容 * param waittime 等待接收的时间单位ms * retval 指向接收缓冲区的指针可能为无效数据 * * note * - 通过u3_printf函数自动添加 \r\n */ uint8_t* esp8266_send_data(uint8_t *cmd, u16 waittime) { char temp[5]; char *ack temp; USART3_RX_STA 0; u3_printf(%s\r\n, cmd); //发送命令 \r\n if (waittime) { while (--waittime) { delay_ms(1); if (USART3_RX_STA 0x8000) //已完整接收一帧数据 { USART3_RX_BUF[USART3_RX_STA 0x7FFF] 0; //结束符 ack (char*)USART3_RX_BUF; printf(ack:%s\r\n, (uint8_t*)ack); break; } } } return (uint8_t*)ack; }向ESP8266模块发送 AT 指令并等待其应答/** * brief 向ESP8266模块发送 AT 指令并等待其应答 * param cmd 指令字符串不含 \r\n * param ack 期待的应答子串如 OK可为NULL * param waittime 超时时间单位ms * retval 0: 成功收到应答 1: 超时 */ uint8_t esp8266_send_cmd(uint8_t *cmd, uint8_t *ack, u16 waittime) { uint8_t res 0; USART3_RX_STA 0; esp8266_send_data(cmd, waittime); //发送指令 ​ if (ack waittime) { while (--waittime) { delay_ms(1); if (USART3_RX_STA 0x8000) //已完整接收一帧数据 { esp8266_check_cmd(ack); //检查应答 printf(ack:%s\r\n, (uint8_t*)ack); USART3_RX_STA 0; break; } } if (waittime 0) res 1; //超时 } return res; }检查 ESP8266 模块返回数据中是否包含指定应答字符串/** * brief 检查ESP8266返回数据中是否包含指定应答 * param str 期待的子字符串如 OK * retval 非 NULL: 指向匹配位置 NULL: 未找到 * * note 使用strstr进行子串匹配比全字匹配更实用 */ uint8_t* esp8266_check_cmd(uint8_t *str) { char *strx 0; if (USART3_RX_STA 0x8000) //已接收完整一帧 { USART3_RX_BUF[USART3_RX_STA 0x7FFF] 0; //结束符 strx strstr((const char*)USART3_RX_BUF, (const char*)str); printf(BACK:%s\n, strx ? strx : NULL); USART3_RX_STA 0; //清除接收标志 } return (uint8_t*)strx; }ESP8266 模块的基础AT指令ESP8266模块的基础AT指令: ​ 基础AT指令测试 依次发送AT、ATGMR、ATE1、ATCWMODE1等指令等待OK应答验证通信链路是否正常。/** * brief 测试ESP8266基础AT指令 * details * - AT模块响应 OK 表示通信正常 * - ATGMR查询固件版本 * - ATE1开启命令回显便于调试 * - ATCWMODE1设置为STA模式 * - ATUART...重新配置串口参数注意执行后需同步更改STM32波特率 * * warning * 执行 \c ATUART后若不立即切换STM32串口波特率后续通信将失败 */ void esp8266_AT_test(void) { esp8266_send_cmd(AT, OK, 10); //基础通信测试 esp8266_send_cmd(ATGMR, OK, 500); //固件版本 esp8266_send_cmd(ATE1, OK, 500); //开启回显 esp8266_send_cmd(ATCWMODE1, OK, 500); //STA模式 esp8266_send_cmd(ATUART115200,8,1,0,3, OK, 500); //重设UART慎用 }七、配置ESP8266模块为STA模式配置ESP8266模块为STA模式AT指令流程 ​ ATCWMODE1 → 设置STA模式。 ATCIPSTAMAC18:fe:35:98:d3:7b → 设置MAC地址可选。 ATCWLAP → 扫描附近AP返回 SSID、加密方式、信号强度。 ATCWJAPWIFI名称,WIFI密码 → 连接Wi-Fi。 ATCIFSR → 查询分配到的IP地址。 ATCWQAP → 断开连接。/** * brief 配置ESP8266为STA模式即配置ESP8266模块连接WIFI * details * - 设置MAC地址可选 * - 扫描附近APATCWLAP * - 连接指定Wi-FiSSIDWIFI名称, 密码WIFI密码 * - 设置静态IP例如192.168.4.2 * - 断开连接ATCWQAP * * note 实际使用时应替换SSID和密码为自己要连接的wifi名和密码 */ void esp8266_STA_test(void) { esp8266_send_cmd(ATCWMODE1, OK, 10); //设置STA模式 esp8266_send_cmd(ATCIPSTAMAC\18:fe:35:98:d3:7b\, OK, 10); //设置MAC地址 esp8266_send_cmd(ATCWLAP, OK, 10); //扫描附近AP esp8266_send_cmd(ATCWJAP\WIFI名称\,\WIFI密码\, OK, 10); //连接Wi-Fi esp8266_send_cmd(ATCIPSTA\自定义静态IP地址\, OK, 10); //设置静态IP esp8266_send_cmd(ATCWQAP, OK, 10); //断开Wi-Fi }八、配置ESP8266模块为AP模式配置ESP8266模块为AP模式AT指令流程 ​ ATCWMODE2 → 设置AP模式。 ATCWSAPMyAP,12345678,1,3 → 设置热点参数SSID、密码、信道、WPA2。 ATCIPAP192.168.4.1 → 设置AP的IP默认 192.168.4.1。 ATCWLIF → 列出已连接的STA。/** * brief 配置ESP8266为AP模式即让ESP8266作为热点 * details * - 创建名为 esp8266、密码 123456789 的AP * - 信道6加密方式 WPA_WPA2_PSK4 * - 设置AP MAC和IP地址 */ void esp8266_AP_test(void) { esp8266_send_cmd(ATCWMODE2, OK, 10); //设置AP模式 esp8266_send_cmd(ATCWSAP\esp8266\,\123456789\,6,4, OK, 10); //设置热点参数 esp8266_send_cmd(ATCIPAPMAC\18:fe:35:98:d3:7b\, OK, 10); //设置AP MAC地址 esp8266_send_cmd(ATCIPAP\192.168.4.2\, OK, 10); //设置AP IP }九、配置ESP8266模块的TCP单连接配置ESP8266模块的TCP单连接AT指令流程 ​ ATCWMODE3 → 设置STAAP模式。 ATCIPMUX0 → 配置为单连接。 ATCWJAPWIFI名称,WIFI密码 → 连接Wi-Fi。 ATCIPSTARTTCP,192.168.4.1,4000 → 建立TCP连接。 ATCIPSEND11 → 准备发送11字节数据。 ABCD → 数据内容。 ATCIPCLOSE → 断开连接。/** * brief TCP单连接客户端 * details * - 连接到远程TCP服务器192.168.4.1:4000 * - 发送4字节数据 ABCD * - 关闭连接 * note 适用于简单点对点通信 */ void esp8266_TCP_Single_STA(void) { esp8266_send_cmd(ATCWMODE3, OK, 10); //STAAP模式 esp8266_send_cmd(ATCIPMUX0, OK, 10); //配置为单连接 esp8266_send_cmd(ATCWJAP\WIFI名称\,\WIFI密码\, OK, 10); //连接Wi-Fi esp8266_send_cmd(ATCIPSTART\TCP\,\192.168.4.1\,4000, OK, 10); //建立TCP连接 esp8266_send_cmd(ATCIPSEND4, OK, 10); //发送4字节 esp8266_send_cmd(ABCD, OK, 10); //数据内容 esp8266_send_cmd(ATCIPCLOSE, OK, 10); //关闭连接 }十、配置ESP8266模块的TCP多连接配置ESP8266模块TCP多连接AT指令流程 ​ ATCWMODE3 → STAAP模式。 ATCIPMUX1 → 启用多连接。 ATCWJAPWIFI名称,WIFI密码 → 连接Wi-Fi。 ATCIPSERVER1 → 启动TCP服务器端口 333。 ATCIPSEND0,11 → 向Link ID 0 发送 11 字节。 ABCD → 数据内容。 ATCIPCLOSE0 → 关闭连接。/** * brief TCP多连接服务器STA 模式 * details * - 开启多连接模式CIPMUX1 * - 启动 TCP 服务器默认端口 333 * - 向连接 0 发送 ABCD * - 关闭该连接 * * warning * 此函数缺少等待客户端连接的逻辑实际需监听IPD事件 */ void esp8266_TCP_Multilink_STA(void) { esp8266_send_cmd(ATCWMODE3, OK, 10); //STAAP模式 esp8266_send_cmd(ATCIPMUX1, OK, 10); //启用多连接 esp8266_send_cmd(ATCWJAP\WIFI名称\,\WIFI密码\, OK, 10); //连接Wi-Fi esp8266_send_cmd(ATCIPSERVER1, OK, 50); //启动TCP服务器 esp8266_send_cmd(ATCIPSEND0,4, OK, 10); //向ID0发送4字节 esp8266_send_cmd(ABCD, OK, 100); //数据内容ABCD esp8266_send_cmd(ATCIPCLOSE0, OK, 10); //关闭连接 }十一、配置ESP8266模块的UDP单连接配置ESP8266模块UDP单连接AT指令流程 ​ ATCWMODE3 → STAAP模式。 ATCIPMUX0 → 单连接。 ATCWJAPWIFI名称,WIFI密码 → 连接Wi-Fi。 ATCIPSTARTUDP,192.168.4.1,4000,1112 → 建立UDP通道绑定本地端口 1112。 ATCIPSEND11 → 准备发送 11 字节。 ABCD → 数据内容。 ATCIPCLOSE → 关闭连接可选。/** * brief UDP单连接通信 * details * - 向指定 IP:PORT 发送UDP数据包 * - 无连接建立过程直接发送 */ void esp8266_UDP_Single(void) { esp8266_send_cmd(ATCWMODE3, OK, 10); //STAAP模式 esp8266_send_cmd(ATCIPMUX0, OK, 10); //配置为单连接 esp8266_send_cmd(ATCWJAP\WIFI名称\,\WIFI密码\, OK, 10); //连接Wi-Fi esp8266_send_cmd(ATCIPSTART\UDP\,\192.168.4.1\,4000, OK, 10); //建立UDP连接 esp8266_send_cmd(ATCIPSEND4, OK, 10); //准备发送4字节数据 esp8266_send_cmd(ABCD, OK, 10); //发送数据ABCD esp8266_send_cmd(ATCIPCLOSE, OK, 10); //关闭连接 }十二、配置ESP8266模块的UDP多连接配置ESP8266模块UDP多连接AT指令流程 ​ ATCWMODE3 → STAAP模式。 ATCIPMUX1 → 启用多连接关键。 ATCWJAPWIFI名称,WIFI密码 → 连接Wi-Fi。 ATCIPSTART0,UDP,192.168.4.1,4000,1112,2 → 建立UDP连接Link ID0绑定本地端口 1112。 ATCIPSEND0,11 → 准备向Link 0发送11字节。 ABCD → 数据内容。 ATCIPCLOSE0 → 关闭连接。/** * brief UDP多连接通信指定本地端口 * details * - ATCIPSTART0,UDP,remote_ip,remote_port,local_port,2 * - 最后一个参数 2 表示启用固定远程地址仅接收来自该地址的数据 */ void esp8266_UDP_Multilink(void) { esp8266_send_cmd(ATCWMODE3, OK, 10); //STAAP模式 esp8266_send_cmd(ATCIPMUX1, OK, 10); //启用多连接 esp8266_send_cmd(ATCWJAP\WIFI名称\,\WIFI密码\, OK, 10); //连接Wi-Fi // 连接 ID0, UDP, remote192.168.4.1:4000, local_port1112, mode2 esp8266_send_cmd(ATCIPSTART0,\UDP\,\192.168.4.1\,4000,1112,2, OK, 10); //建立UDP连接 esp8266_send_cmd(ATCIPSEND0,4, OK, 10); //准备发送数据 esp8266_send_cmd(ABCD, OK, 10); //发送数据 esp8266_send_cmd(ATCIPCLOSE, OK, 10); //关闭连接 }十三、配置ESP8266模块的TCP透传配置ESP8266模块TCP透传AT指令流程 ​ ATCWMODE3 → STAAP模式。 ATCIPMUX0 → 单连接透传必须。 ATCWJAPWIFI名称,WIFI密码 → 连接Wi-Fi。 ATCIPSTARTTCP,192.168.4.1,4000 → 建立TCP连接。 ATCIPMODE1 → 开启透传模式。 ATCIPSEND → 进入透传发送状态返回。 透传阶段USART1与USART3之间数据直接转发由中断或轮询实现不再处理AT指令。 退出透传发送前后空闲 ≥100ms。 最后执行ATCIPMODE0 → 关闭透传模式。 和ATCIPCLOSE → 关闭连接。/** * brief TCP透传模式Serial-to-Network * details * - 进入透传后STM32串口数据直接转发到TCP服务器 * - 退出需发送 前后需空闲 10ms * - 退出后需关闭透传模式CIPMODE0 */ void esp8266_TCP_SeriaNet(void) { esp8266_send_cmd(ATCWMODE3, OK, 10); //STAAP模式 esp8266_send_cmd(ATCIPMUX0, OK, 10); //配置为单连接透传必须 esp8266_send_cmd(ATCWJAP\WIFI名称\,\WIFI密码\, OK, 10); //连接Wi-Fi esp8266_send_cmd(ATCIPSTART\TCP\,\192.168.4.1\,4000, OK, 10); //建立TCP连接 esp8266_send_cmd(ATCIPMODE1, OK, 10); //开启透传 esp8266_send_cmd(ATCIPSEND, OK, 10); //进入透传发送状态 esp8266_send_cmd(ABCD1234, , 10); //直接发送数据无应答 esp8266_send_cmd(, , 1); //退出透传关键 esp8266_send_cmd(ATCIPMODE0, OK, 10); //关闭透传模式 esp8266_send_cmd(ATCIPCLOSE, OK, 10); //关闭连接 }十四、配置ESP8266模块的UDP透传配置ESP8266模块UDP透传AT指令流程 ​ ATCWMODE3 → STAAP模式。 ATCIPMUX0 → 单连接透传必须。 ATCWJAPWIFI名称,WIFI密码 → 连接Wi-Fi。 ATCIPSTARTUDP,192.168.4.1,4000 → 建立UDP连接可指定本地端口。 ATCIPMODE1 → 开启透传模式。 ATCIPSEND → 进入透传状态返回。 透传阶段USART1与USART3 数据直通不再解析AT指令。 退出透传发送前后空闲 ≥100ms。 最后执行ATCIPMODE0 → 关闭透传模式。 和ATCIPCLOSE → 关闭连接。/** * brief UDP透传模式 * details 与TCP透传类似但基于UDP协议 */ void esp8266_UDP_SeriaNet(void) { esp8266_send_cmd(ATCWMODE3, OK, 10); //STAAP模式 esp8266_send_cmd(ATCIPMUX0, OK, 10); //配置为单连接透传必须 esp8266_send_cmd(ATCWJAP\WIFI名称\,\WIFI密码\, OK, 10); //连接Wi-Fi esp8266_send_cmd(ATCIPSTART\UDP\,\192.168.4.1\,4000, OK, 10);//建立UDP连接 esp8266_send_cmd(ATCIPMODE1, OK, 10); //开启透传模式 esp8266_send_cmd(ATCIPSEND, OK, 10); //进入透传发送状态 esp8266_send_cmd(ABCD1234, , 10); //直接发送数据无应答 esp8266_send_cmd(, , 10); //退出透传 esp8266_send_cmd(ATCIPMODE0, OK, 10); //关闭透传模式 esp8266_send_cmd(ATCIPCLOSE, OK, 10); //关闭连接 }十五、配置 ESP8266模块进入透传模式完整流程/** * brief 配置ESP8266进入透传模式完整流程 * details * - 重启模块 * - 连接指定Wi-Fi * - 建立TCP连接 * - 开启透传并进入发送状态 * - 此后STM32串口数据将直接透传到服务器 */ void esp8266_start_trans(void) { esp8266_send_cmd(ATCWMODE1, OK, 5); esp8266_send_cmd(ATRST, ready, 2); //重启 delay_ms(1000); //等待重启完成 ​ // 循环连接 Wi-Fi 直到成功 while (esp8266_send_cmd(ATCWJAP\xxxx\,\xxxx\, WIFI GOT IP, 6)); ​ esp8266_send_cmd(ATCIPMUX0, OK, 2); //配置为单连接透传必须 // 循环连接服务器直到成功 while (esp8266_send_cmd(ATCIPSTART\TCP\,\xxx.xxx.xxx.xxx\,xxxx, CONNECT, 20)); ​ esp8266_send_cmd(ATCIPMODE1, OK, 2); //开启透传 esp8266_send_cmd(ATCIPSEND, OK, 50); //进入透传发送状态 }十六、配置ESP8266模块退出透传模式ESP8266模块退出透传模式只需要在当前透传模式下发送退出透传指令即可退出透传模式回到AT指令模式。/** * brief 退出透传模式 * retval 0: 成功 1: 失败 * details * - 发送 必须前后有 100ms 空闲 * - 发送 AT 测试是否退出成功 */ uint8_t esp8266_quit_trans(void) { uint8_t result 1; u3_printf(); //发送退出透传指令 delay_ms(200); result esp8266_send_cmd(AT, OK, 20); //发送AT测试指令测试是否退出透传成功 if (result) printf(quit_trans failed!); else printf(quit_trans success!); return result; }