一、硬件连接与配置
-
硬件连接
-
核心引脚:
-
STM32的
TX→ ESP8266的RX -
STM32的
RX→ ESP8266的TX -
共地(GND)
-
ESP8266供电需稳定3.3V(避免使用5V供电)
-
-
示例接线:
cSTM32 (TX) → ESP8266 (RX) STM32 (RX) → ESP8266 (TX) STM32 (3.3V) → ESP8266 (CH_PD) GND → GND
-
-
电平匹配
- ESP8266为3.3V逻辑电平,需确保STM32的串口电平兼容(部分STM32需电平转换电路)。
二、AT指令配置流程
-
初始化ESP8266
-
复位模块 :发送
AT+RST重启模块。 -
设置工作模式 :
AT+CWMODE=1(Station模式,连接路由器)。 -
关闭回显 :
ATE0(可选,减少调试干扰)。
-
-
连接Wi-Fi
c// 示例代码(基于HAL库) void ESP8266_ConnectWiFi(const char* ssid, const char* pwd) { char cmd[100]; sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, pwd); ESP8266_SendCommand(cmd, "OK", 10000); // 超时10秒 }- 需处理连接失败重试逻辑(如循环尝试5次)。
-
建立TCP连接
c// 示例:连接服务器(IP:192.168.1.100,端口8080) void ESP8266_ConnectServer(const char* ip, uint16_t port) { char cmd[50]; sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", ip, port); ESP8266_SendCommand(cmd, "CONNECT", 10000); }- 成功返回
CONNECT标识。
- 成功返回
三、数据发送实现
-
发送数据流程
-
发送数据长度 :
AT+CIPSEND=<长度>(需包含\r\n)。 -
发送数据内容:直接发送原始数据(如JSON或字符串)。
c// 示例:发送字符串"Hello Server" void ESP8266_SendData(const char* data) { char cmd[20]; sprintf(cmd, "AT+CIPSEND=%d\r\n", strlen(data)); ESP8266_SendCommand(cmd, ">", 2000); // 等待">"提示符 HAL_UART_Transmit(&huart1, (uint8_t*)data, strlen(data), 1000); } -
-
HTTP请求示例
c// 发送POST请求(需包含Host和Content-Length) char httpRequest[] = "POST /api/data HTTP/1.1\r\n" "Host: 192.168.1.100\r\n" "Content-Type: application/json\r\n" "Content-Length: 29\r\n\r\n" "{\"temp\":25.5,\"humidity\":60}"; ESP8266_SendCommand(httpRequest, "SEND OK", 10000);
四、数据接收与处理
-
接收模式
-
非透传模式 :通过
AT+CIPMODE=0设置,接收数据需解析+IPD标识。 -
透传模式 :
AT+CIPMODE=1,数据直通串口(需自行处理协议)。
-
-
接收回调函数
cvoid HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { if (huart->Instance == USART1) { // 解析接收数据(如检查"OK"或错误码) ESP8266_ParseResponse(esp8266_rxbuf); memset(esp8266_rxbuf, 0, sizeof(esp8266_rxbuf)); } }
五、优化与调试技巧
-
关键优化点
-
超时处理:设置AT指令响应超时(如5秒),避免程序卡死。
-
缓冲区管理:使用环形缓冲区或DMA接收数据,防止溢出。
-
关闭冗余功能 :如
AT+CIPDINFO=0隐藏IP显示,减少干扰。
-
-
调试工具
-
串口助手:手动发送AT指令验证模块响应。
-
Wireshark:抓包分析TCP通信过程。
-
日志打印 :通过
printf输出关键步骤状态。
-
参考代码 stm32使用esp8266发送数据 www.youwenfan.com/contentcsp/112865.html
六、完整代码框架
c
// 主函数示例
int main(void) {
HAL_Init();
SystemClock_Config();
MX_USART1_UART_Init(); // 初始化串口1(连接ESP8266)
// 初始化ESP8266
ESP8266_Init();
ESP8266_ConnectWiFi("Your_SSID", "Your_Password");
ESP8266_ConnectServer("192.168.1.100", 8080);
while (1) {
ESP8266_SendData("Hello from STM32!");
HAL_Delay(5000); // 每5秒发送一次
}
}
// ESP8266发送指令函数
ESP8266_Status ESP8266_SendCommand(const char* cmd, const char* response, uint32_t timeout) {
HAL_UART_Transmit(&huart1, (uint8_t*)cmd, strlen(cmd), 1000);
HAL_Delay(100); // 等待发送完成
uint32_t start = HAL_GetTick();
while ((HAL_GetTick() - start) < timeout) {
if (strstr(esp8266_rxbuf, response)) return ESP8266_OK;
}
return ESP8266_TIMEOUT;
}
七、常见问题解决
-
AT指令无响应
-
检查波特率是否匹配(默认115200)。
-
确认TX/RX交叉连接,电源稳定。
-
-
TCP连接失败
-
检查服务器IP和端口是否可达。
-
使用
AT+CIFSR查询ESP8266本地IP,确认网络配置正确。
-
-
数据丢包
-
启用TCP Keep-Alive机制(如
AT+CIPOPEN=0,0,60)。 -
增加发送间隔或启用数据校验(如CRC)。
-