高级会员

- 积分
- 696
- 金钱
- 696
- 注册时间
- 2026-1-29
- 在线时间
- 52 小时
|
以下是基于STM32F103与ESP8266通过UART实现WiFi数据传输的完整原创源码,包含关键函数实现和AT指令处理逻辑:
/* 头文件包含 */
#include "stm32f1xx_hal.h"
#include "string.h"
#include "stdio.h"
#include "esp8266.h"
/* 定义WiFi参数 */
#define WIFI_SSID "Your_SSID"
#define WIFI_PASSWORD "Your_PASSWORD"
#define SERVER_IP "192.168.1.100"
#define SERVER_PORT 8080
/* UART句柄 */
UART_HandleTypeDef huart1;
uint8_t uart_buf[512];
uint16_t uart_len = 0;
/* ESP8266响应状态 */
typedef enum {
AT_OK = 0,
AT_ERROR,
AT_TIMEOUT,
AT_BUSY
} AT_Status;
/* 函数声明 */
void Error_Handler(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
AT_Status ESP8266_SendCommand(char *cmd, uint16_t timeout);
AT_Status ESP8266_Init(void);
AT_Status ESP8266_ConnectToWiFi(char *ssid, char *pwd);
AT_Status ESP8266_SendData(char *ip, uint16_t port, char *data);
/* 主函数 */
int main(void)
{
HAL_Init();
MX_GPIO_Init();
MX_USART1_UART_Init();
/* 初始化ESP8266模块 */
if (ESP8266_Init() != AT_OK)
{
Error_Handler();
}
/* 连接WiFi */
if (ESP8266_ConnectToWiFi(WIFI_SSID, WIFI_PASSWORD) != AT_OK)
{
Error_Handler();
}
/* 主循环 */
while (1)
{
/* 发送数据到服务器 */
if (ESP8266_SendData(SERVER_IP, SERVER_PORT, "Hello from STM32!") != AT_OK)
{
Error_Handler();
}
HAL_Delay(1000);
}
}
/* UART初始化 */
static 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;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
/* GPIO初始化 */
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/* 配置ESP8266的复位和使能引脚 */
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/* 发送AT指令并检查响应 */
AT_Status ESP8266_SendCommand(char *cmd, uint16_t timeout)
{
uint32_t tickstart = HAL_GetTick();
/* 清空接收缓冲区 */
memset(uart_buf, 0, sizeof(uart_buf));
uart_len = 0;
/* 发送AT指令 */
HAL_UART_Transmit(&huart1, (uint8_t *)cmd, strlen(cmd), 1000);
/* 等待响应 */
while ((HAL_GetTick() - tickstart) < timeout)
{
if (HAL_UART_Receive(&huart1, (uint8_t *)uart_buf, 1, 0) == HAL_OK)
{
uart_len++;
if (strstr((char *)uart_buf, "OK") || strstr((char *)uart_buf, "ERROR"))
{
break;
}
}
}
if (strstr((char *)uart_buf, "OK"))
return AT_OK;
else if (strstr((char *)uart_buf, "ERROR"))
return AT_ERROR;
else
return AT_TIMEOUT;
}
/* 初始化ESP8266模块 */
AT_Status ESP8266_Init(void)
{
/* 复位模块 */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_Delay(500);
/* 测试AT指令 */
if (ESP8266_SendCommand("AT\r\n", 1000) != AT_OK)
{
return AT_ERROR;
}
/* 设置STA模式 */
if (ESP8266_SendCommand("AT+CWMODE=1\r\n", 1000) != AT_OK)
{
return AT_ERROR;
}
return AT_OK;
}
/* 连接WiFi */
AT_Status ESP8266_ConnectToWiFi(char *ssid, char *pwd)
{
char cmd[128];
/* 发送连接指令 */
sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, pwd);
return ESP8266_SendCommand(cmd, 15000);
}
/* 发送数据到服务器 */
AT_Status ESP8266_SendData(char *ip, uint16_t port, char *data)
{
char cmd[256];
/* 建立TCP连接 */
sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", ip, port);
if (ESP8266_SendCommand(cmd, 5000) != AT_OK)
{
return AT_ERROR;
}
/* 发送数据 */
sprintf(cmd, "AT+CIPSEND=%d\r\n", strlen(data));
if (ESP8266_SendCommand(cmd, 2000) != AT_OK)
{
return AT_ERROR;
}
/* 发送实际数据 */
HAL_UART_Transmit(&huart1, (uint8_t *)data, strlen(data), 1000);
/* 关闭连接 */
ESP8266_SendCommand("AT+CIPCLOSE\r\n", 2000);
return AT_OK;
}
/* 错误处理 */
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
__enable_irq();
}
代码说明:
初始化流程:
ESP8266_Init() 通过复位引脚和AT指令初始化模块
ESP8266_ConnectToWiFi() 使用AT+CWJAP指令连接指定WiFi
数据发送:
使用AT+CIPSTART建立TCP连接
通过AT+CIPSEND指定数据长度后发送数据
支持自动关闭连接
错误处理:
每个AT指令都有超时检测
支持错误状态返回(AT_ERROR/AT_TIMEOUT)
硬件配置:
使用USART1与ESP8266通信(115200波特率)
PB0/PB1控制模块复位和使能引脚
使用说明:
将代码移植到STM32工程中
修改WiFi参数(SSID/密码)和服务器地址
确保ESP8266模块接线正确:
TXD <-> PA9 (USART1_TX)
RXD <-> PA10 (USART1_RX)
RST <-> PB0
CHIP_EN <-> PB1
该代码可直接用于STM32F1系列与ESP8266的简单数据传输场景。 |
|