OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 266|回复: 1

求助基于STM32Fx与ESP8266模块wIFi联网传输数据(利用UART)源程序)

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2019-5-17
在线时间
3 小时
发表于 6 天前 | 显示全部楼层 |阅读模式
1金钱
请问:哪位高手有基于STM32Fx与ESP8266模块WiFi联网传输数据(利用UART)的源程序?可以有赏下载(请先说明是为原创的软件)。

回复

使用道具 举报

0

主题

141

帖子

0

精华

高级会员

Rank: 4

积分
696
金钱
696
注册时间
2026-1-29
在线时间
52 小时
发表于 4 天前 | 显示全部楼层
以下是基于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的简单数据传输场景。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-9-19 04:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表