高级会员

- 积分
- 696
- 金钱
- 696
- 注册时间
- 2026-1-29
- 在线时间
- 52 小时
|
以下是基于STM32Fx与ESP8266通过UART实现WiFi联网传输数据的完整解决方案,包含硬件连接、代码框架及关键实现步骤。代码结构清晰,可直接集成到STM32CubeIDE或Keil项目中:
一、硬件连接
串口连接:
STM32的TX(PA9) → ESP8266的RX
STM32的RX(PA10) → ESP8266的TX
共地(GND)
ESP8266供电:使用STM32的3.3V输出,确保电流足够(建议并联10μF电容稳压)
电平匹配:
ESP8266为3.3V逻辑电平,需确保STM32的串口电平兼容。
二、代码实现
1. UART初始化(基于HAL库)
UART_HandleTypeDef huart1;
void MX_USART1_UART_Init(void) {
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
HAL_UART_Init(&huart1);
}
2. ESP8266 AT指令控制
void ESP8266_SendATCommand(const char* cmd) {
HAL_UART_Transmit(&huart1, (uint8_t*)cmd, strlen(cmd), 1000);
}
void ESP8266_ConnectWiFi(const char* ssid, const char* pwd) {
char cmd[128];
sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, pwd);
ESP8266_SendATCommand(cmd);
HAL_Delay(5000); // 等待连接
}
3. 数据发送(TCP示例)
void SendDataOverTCP(const char* data) {
// 建立TCP连接(示例指向httpbin.org)
ESP8266_SendATCommand("AT+CIPSTART=\"TCP\",\"httpbin.org\",80\r\n");
HAL_Delay(2000);
// 发送HTTP请求
char httpRequest[512];
sprintf(httpRequest,
"POST /post HTTP/1.1\r\n"
"Host: httpbin.org\r\n"
"Content-Type: application/json\r\n"
"Content-Length: %d\r\n\r\n%s",
strlen(data), data);
// 发送数据长度及内容
char lenCmd[32];
sprintf(lenCmd, "AT+CIPSEND=%d\r\n", strlen(httpRequest));
ESP8266_SendATCommand(lenCmd);
HAL_Delay(500);
ESP8266_SendATCommand(httpRequest);
}
4. 接收数据处理(中断方式)
uint8_t rxBuffer[512];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
// 解析ESP8266返回的数据(如"+IPD"或错误码)
// 重新开启接收中断
HAL_UART_Receive_IT(&huart1, rxBuffer, 1);
}
}
三、完整工作流程
初始化:配置STM32时钟、UART及GPIO。
连接WiFi:发送AT+CWJAP指令连接路由器。
建立TCP连接:通过AT+CIPSTART连接服务器。
发送数据:封装HTTP/JSON格式数据,使用AT+CIPSEND发送。
错误处理:检测ESP8266返回的ERROR或CLOSED标识,实现重连机制。
四、扩展功能
MQTT协议:替换为MQTT指令(需ESP8266支持AT+MQTT):
void ConnectMQTTBroker(const char* broker, int port) {
char cmd[128];
sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", broker, port);
ESP8266_SendATCommand(cmd);
}
云平台集成:修改HTTP请求中的Host和路径,适配阿里云/腾讯云API。
五、注意事项
AT指令响应时间:在指令后添加足够延时(如HAL_Delay(2000))。
电源管理:ESP8266发送数据时电流可能达300mA,需独立供电。
调试工具:通过串口助手验证AT指令返回值(如OK或ERROR)。
源码下载
完整代码(含注释及错误处理)可参考开源项目:
GitHub开源示例:STM32_ESP8266_UART
开发者社区资源:STM32+ESP8266局域网通信(含Flask服务器代码)
提示:实际应用中需根据硬件调整引脚映射和时钟配置,建议使用STM32CubeMX生成初始化代码。 |
|