STM32-连接wifi模块(esp8266)

这篇具有很好参考价值的文章主要介绍了STM32-连接wifi模块(esp8266)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. ESP8266模块介绍

1.1. 系统结构图

1.2. 功能介绍

 1.3. AT指令说明

 2. STM32连接ESP8266

3. ESP8266示例

3.1. ESP8266透传模式

 3.2. ESP8266上传数据例程


1. ESP8266模块介绍

1.1. 系统结构图

乐鑫智能互联平台——ESP8266 拥有高性能无线 SOC,是一个完整且自成体系的 WiFi 网络解决方案,能够独立运行,也可以作为 slave 搭载于其他 Host 运行。

装有ESP8266的系统表现出来的领先特征有:节能VoIP在睡眠/唤醒模式之间的快速切换、配合低功率操作的自适应无线电偏置、前端信号的处理功能、故障排除和无线电系统共存特性为消除蜂窝/蓝牙/DDR/LVDS/LCD干扰。

 stm32wifi模块,STM32驱动,stm32,单片机,嵌入式硬件

 管脚定义:

stm32wifi模块,STM32驱动,stm32,单片机,嵌入式硬件

stm32wifi模块,STM32驱动,stm32,单片机,嵌入式硬件

stm32wifi模块,STM32驱动,stm32,单片机,嵌入式硬件

1.2. 功能介绍

ESP8266 支持 softAP 模式,station 模式,softAP + station 共存模式三种。
利用 ESP8266 可以实现十分灵活的组网方式和网络拓扑。
注,
SoftAP:即无线接入点,是一个无线网络的中心节点。通常使用的无线路
由器就是一个无线接入点。
Station:即无线终端,是一个无线网络的终端端。 

提供三种省电模式:

stm32wifi模块,STM32驱动,stm32,单片机,嵌入式硬件

 1.3. AT指令说明

AT指令分类: 

stm32wifi模块,STM32驱动,stm32,单片机,嵌入式硬件

指令集:

stm32wifi模块,STM32驱动,stm32,单片机,嵌入式硬件

 2. STM32连接ESP8266

用STM32F103的USART3(PB10、PB11)连接ESP8266的URXD、UTXD,PB8连接CH-PD,PB9连接RST。

3. ESP8266示例

3.1. ESP8266透传模式

打开CubeMX, 配置USART1和USART3,并且NVIC处Enable打√,USART1用于与电脑的串口调试助手连接,USART3用于与ESP8266的串口连接:

stm32wifi模块,STM32驱动,stm32,单片机,嵌入式硬件

在main.c定义变量,并且配置非阻塞接收:

//main.c:

uint8_t revData[100];
uint8_t esp8266RevData[200];
int main(void)
{
	HAL_UARTEx_ReceiveToIdle_IT(&huart1, revData, 100);
	HAL_UARTEx_ReceiveToIdle_IT(&huart3, esp8266RevData, 200);
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

在usart.c文件中重写HAL_UARTEx_RxEventCallback函数:

//usart.c:

#include <stdio.h>

extern uint8_t revData[100];
extern uint8_t esp8266RevData[200];

/* USER CODE BEGIN 1 */
int fputc(int ch,FILE *f)
{
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,1000);
	return ch;
}


void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{

	if(huart->Instance==USART1)
	{
//		HAL_UART_Transmit(&huart1,revData,Size,10);
		HAL_UART_Transmit(&huart3,revData,Size,10);	
		
		while(HAL_UARTEx_ReceiveToIdle_IT(&huart1, revData, 100) != HAL_OK);
	}
	else if(huart->Instance==USART3)
	{
		HAL_UART_Transmit(&huart1,esp8266RevData,Size,10);	
		while(HAL_UARTEx_ReceiveToIdle_IT(&huart3, esp8266RevData, 200) != HAL_OK);
	}
}


/* USER CODE END 1 */

编译并且烧录至单片机,可以看到串口助手输入指令后正确的得到反馈:

stm32wifi模块,STM32驱动,stm32,单片机,嵌入式硬件

 3.2. ESP8266上传数据例程

新增接收数据大小的变量:

//usart.c
uint16_t *esp8266Size;

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{

	if(huart->Instance==USART1)
	{
//		HAL_UART_Transmit(&huart1,revData,Size,10);
		HAL_UART_Transmit(&huart3,revData,Size,10);	
		
		while(HAL_UARTEx_ReceiveToIdle_IT(&huart1, revData, 100) != HAL_OK);
	}
	else if(huart->Instance==USART3)
	{
		HAL_UART_Transmit(&huart1,esp8266RevData,Size,10);	
		esp8266Size=&Size;
		while(HAL_UARTEx_ReceiveToIdle_IT(&huart3, esp8266RevData, 200) != HAL_OK);
	}
}

编写wifi AT指令的操作函数:

//usart.c

/*
 * 函数名:cmdAT
 * 描述  :对WF-ESP8266模块发送AT指令
 * 输入  :cmdData,待发送的指令
 *         expReturn1,expReturn2,期待的响应,为NULL表不需响应,两者为或逻辑关系
 * 返回  : 1,指令发送成功
 *         0,指令发送失败
 * 调用  :被外部调用
 */
_Bool cmdAT(char *cmdData,char *expReturn1,char *expReturn2)
{
	char cmdDataTmp[40];
	sprintf(cmdDataTmp,"%s\r\n",cmdData);
	HAL_UART_Transmit(&huart3,(uint8_t *)cmdDataTmp,strlen(cmdDataTmp),10);	
//	printf("cmdDataTmp:%s\r\nlenth:%d",cmdDataTmp,sizeof((char *)cmdDataTmp)/sizeof(char));
	if(expReturn1==NULL && expReturn2==NULL)
		return 1;
	HAL_Delay(100);
	uint8_t count=0;
	if(esp8266Size==0 || count<40)
	{
		HAL_Delay(200);
		count++;
	}
	esp8266RevData[*esp8266Size]='\0';
	esp8266Size=0;
	if(expReturn2!=NULL)
		return (((_Bool)strstr((const char *)esp8266RevData,expReturn1))||((_Bool)strstr((const char *)esp8266RevData,expReturn2)));
	else
		return ((_Bool)strstr((const char *)esp8266RevData,expReturn1));
}

_Bool testAT( void )
{
	char count=0;

//	ESP8266_RST_H;	
  printf("\r\n测试AT启动\r\n");
	HAL_Delay ( 100 );
	while ( count < 5 )
	{
    printf("\r\n第%d次尝试连接AT\r\n", count);
		if( cmdAT ( "AT", "OK",NULL) )
    {
      printf("\r\nAT成功启动\r\n");
      return 1;
    }
		ESP8266_RST_L;
		HAL_Delay(500);
		ESP8266_RST_H;
		HAL_Delay(1000);
		++ count;
	}
  return 0;
}

_Bool ESP8266_DHCP_CUR (void)
{
	return cmdAT( "AT+CWDHCP_CUR=1,1", "OK",NULL);
}

/*
 * 函数名:ESP8266_Net_Mode_Choose
 * 描述  :选择WF-ESP8266模块的工作模式
 * 输入  :enumMode,工作模式
 * 返回  : 1,选择成功
 *         0,选择失败
 * 调用  :被外部调用
 */
_Bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode )
{
	switch ( enumMode )
	{
		case STA:
			return cmdAT ( "AT+CWMODE=1", "OK",NULL); 
		
	  case AP:
		  return cmdAT ( "AT+CWMODE=2", "OK",NULL); 
		
		case STA_AP:
		  return cmdAT ( "AT+CWMODE=3", "OK",NULL); 
		
	  default:
		  return 0;
  }
	
}

/*
 * 函数名:ESP8266_JoinAP
 * 描述  :WF-ESP8266模块连接外部WiFi
 * 输入  :pSSID,WiFi名称字符串
 *       :pPassWord,WiFi密码字符串
 * 返回  : 1,连接成功
 *         0,连接失败
 * 调用  :被外部调用
 */
_Bool ESP8266_JoinAP ( char * pSSID, char * pPassWord )
{
	char cCmd [120];

	sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord );
	
	return cmdAT ( cCmd, "OK",NULL);
	
}

/*
 * 函数名:ESP8266_Enable_MultipleId
 * 描述  :WF-ESP8266模块启动多连接
 * 输入  :enumEnUnvarnishTx,配置是否多连接
 * 返回  : 1,配置成功
 *         0,配置失败
 * 调用  :被外部调用
 */
_Bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx )
{
	char cStr [20];
	
	sprintf ( cStr, "AT+CIPMUX=%d", ( enumEnUnvarnishTx ? 1 : 0 ) );
	
	return cmdAT ( cStr, "OK",NULL);
	
}

/*
 * 函数名:ESP8266_Link_Server
 * 描述  :WF-ESP8266模块连接外部服务器
 * 输入  :enumE,网络协议
 *       :ip,服务器IP字符串
 *       :ComNum,服务器端口字符串
 *       :id,模块连接服务器的ID
 * 返回  : 1,连接成功
 *         0,连接失败
 * 调用  :被外部调用
 */
_Bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id)
{
	char cStr [100] = { 0 }, cCmd [120];

  switch (  enumE )
  {
		case enumTCP:
		  sprintf ( cStr, "\"%s\",\"%s\",%s", "TCP", ip, ComNum );
		  break;
		
		case enumUDP:
		  sprintf ( cStr, "\"%s\",\"%s\",%s", "UDP", ip, ComNum );
		  break;
		
		default:
			break;
  }

  if ( id < 5 )
    sprintf ( cCmd, "AT+CIPSTART=%d,%s", id, cStr);

  else
	  sprintf ( cCmd, "AT+CIPSTART=%s", cStr );

	return cmdAT ( cCmd, "OK","ALREADY CONNECTED");
	
}

/*
 * 函数名:ESP8266_UnvarnishSend
 * 描述  :配置WF-ESP8266模块进入透传发送
 * 输入  :无
 * 返回  : 1,配置成功
 *         0,配置失败
 * 调用  :被外部调用
 */
_Bool ESP8266_UnvarnishSend ( void )
{
	if ( ! cmdAT ( "AT+CIPMODE=1", "OK", NULL ) )
		return 0;
	
	return 
	  cmdAT ( "AT+CIPSEND", "OK", ">" );
	
}

在usart.h配置宏定义和函数声明:

/* USER CODE BEGIN Private defines */
typedef enum{
	STA,
  AP,
  STA_AP  
} ENUM_Net_ModeTypeDef;

typedef enum{
	 enumTCP,
	 enumUDP,
} ENUM_NetPro_TypeDef;
	

typedef enum{
	Multiple_ID_0 = 0,
	Multiple_ID_1 = 1,
	Multiple_ID_2 = 2,
	Multiple_ID_3 = 3,
	Multiple_ID_4 = 4,
	Single_ID_0 = 5,
} ENUM_ID_NO_TypeDef;
	
/* USER CODE END Private defines */

void MX_USART1_UART_Init(void);
void MX_USART3_UART_Init(void);

/* USER CODE BEGIN Prototypes */
_Bool cmdAT(char *cmdData,char *expReturn1,char *expReturn2);
_Bool testAT( void );
_Bool ESP8266_DHCP_CUR (void);
_Bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode );
_Bool ESP8266_JoinAP ( char * pSSID, char * pPassWord );
_Bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx );
_Bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id);
_Bool ESP8266_UnvarnishSend ( void );

/* USER CODE END Prototypes */

编写初始化函数:

//esp8266_test.h

#ifndef __ESP8266_TEST_H__
#define __ESP8266_TEST_H__

#ifdef __cplusplus
extern "C" {
#endif

#define WIFI_SSID                "nomi"                //要连接的热点的名称
#define WIFI_PASSWORD            "fdhgtdhrt"           //要连接的热点的密钥

#define SERVER_IP                "192.168.64.74"      //要连接的服务器的 IP
#define SERVER_PORT              "8000"               //要连接的服务器的端口


void initEsp8266(void);

#ifdef __cplusplus
}
#endif

#endif /* __ESP8266_TEST_H__ */
//esp8266_test.c

#include "esp8266_test.h"
#include <stdio.h>
#include "usart.h"

void initEsp8266(void)
{
	printf("\r\n开始测试AT启动:\r\n");
	if(testAT()==0)
	{
		printf("AT连接不上!");
		return;
	}
	
	printf("\r\n设置DHCP获取:\r\n");
	_Bool dhcpreturn=ESP8266_DHCP_CUR();
	printf("testdhcpreturn:%d",dhcpreturn);
	if(ESP8266_DHCP_CUR()==0)
	{
		printf("设置DHCP获取失败!\r\n");
	}
	printf("\r\n选择WF-ESP8266模块的工作模式为STA:\r\n");
	if(ESP8266_Net_Mode_Choose(STA)==0)
	{
		printf("选择WF-ESP8266模块的工作模式失败!\r\n");
	}
	printf("\r\n连接WiFi:\r\n");
	if(ESP8266_JoinAP (WIFI_SSID,WIFI_PASSWORD)==0)
	{
		printf("WiFi连接不上!\r\n");
		return;
	}
	printf("\r\nESP8266模块启动单连接:\r\n");
	if(ESP8266_Enable_MultipleId (DISABLE)==0)
	{
		printf("ESP8266模块启动单连接失败!\r\n");
		return;
	}
	
	HAL_Delay(2000);
	printf("\r\n连接外部服务器:\r\n");
	while(ESP8266_Link_Server (enumTCP,SERVER_IP,SERVER_PORT,Single_ID_0)==0)
	{
		printf("服务器连接不上!\r\n");
		HAL_Delay(1000);
	}
	printf("\r\n进入透传发送:\r\n");
	if(ESP8266_UnvarnishSend()==0)
	{
		printf("进入透传发送失败!\r\n");
		return;
	}
	
	printf( "\r\n配置 ESP8266 完毕\r\n" );
	printf ( "\r\n开始透传......\r\n" );
  
}

在main.c写初始化测试语句:

//main.c

	HAL_UARTEx_ReceiveToIdle_IT(&huart1, revData, 100);
	HAL_UARTEx_ReceiveToIdle_IT(&huart3, esp8266RevData, 200);
	HAL_Delay(1000);
	initEsp8266();
	HAL_Delay(100);
	HAL_UART_Transmit(&huart3,(uint8_t *)"wendu",5,10);

网络助手打开监听模式。

运行程序,在串口助手中看到提示正常:

stm32wifi模块,STM32驱动,stm32,单片机,嵌入式硬件

网络助手正常收到消息:

stm32wifi模块,STM32驱动,stm32,单片机,嵌入式硬件 

 文章来源地址https://www.toymoban.com/news/detail-792792.html

到了这里,关于STM32-连接wifi模块(esp8266)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于stm32 ESP8266WiFi模块的基本通信

    本篇涉及到的模块与工具为: 1. ATK-ESP8266wifi模块 2. USB-UART模块 3. 串口调试助手 提取链接:https://pan.baidu.com/s/17xRlpnjp8j-VvyD2VDxNXw?pwd=ufms 提取码:ufms 4. 网络调试助手 提取链接:https://pan.baidu.com/s/10spxZmwMGI70USlzkOzdxg?pwd=fmxe 提取码:fmxe 程序源码提取连接放置文章底部,需者自提

    2024年02月02日
    浏览(83)
  • stm32 的 ESP8266 wifi 模块 (ESP - 12s) 的使用

    1. ESP8266 的器件介绍 2. ESP2866外设  的引脚  3. 我所用的的ESP2866 的引脚图 4. 代码 编程的串口 5.wifi 的指令 1. AT     测试指令 2. AT+RST   重启模块 3. AT+GMR  查看版本信息 4. AT+RESTORE   恢复出厂设置 5.  AT+UART=115200,8,1,0,0   串口设置  串口号, 数据位, 停止位,  6. 

    2024年02月02日
    浏览(47)
  • STM32+esp8266实现单片机与服务器的WiFi通信

             源码已上传至gitee: stm32: 一些stm32模块使用经验记录 - Gitee.com https://gitee.com/lrf1125962926/stm32/tree/esp8266wifi%E9%80%9A%E4%BF%A1/         本实验采用STM32F1系列+esp8266 01s模块,采用HAL库开发。主控芯片哪个系列和型号都可以,只要有两个串口(UART或者USART,以下统称串口)

    2024年02月07日
    浏览(40)
  • 猿创征文 | 【STM32】ESP8266 wifi模块创建阿里云产品

    📑博客主页:@丘比特惩罚陆 💖欢迎关注:点赞收藏⭐留言✒ 💬系列专栏:嵌入式、web前端、笔记专栏 🎮 加入社区: 灌水乐园 🥇人生格言:选对方向,每走一步都是进步! ✒️欢迎大佬指正,一起学习!一起加油! 👏 希望大家能小手一动,帮忙点个赞! 😁资源邮箱

    2023年04月18日
    浏览(46)
  • STM32--ESP8266物联网WIFI模块(贝壳物联)--远程无线控制点灯

    本文适用于STM32F103C8T6等MCU,其他MCU可以移植,完整资源见文末链接 一、简介 随着移动物联网的发展,各场景下对于物联控制、数据上传、远程控制的诉求也越来越多,基于此乐鑫科技推出了便宜好用性价比极高的wifi物联模块——ESP8266,话不多少我们先来看看这个神奇的模

    2024年02月08日
    浏览(52)
  • STM32通过esp8266连接WiFi接入MQTT服务器

    上文我们讲到如何搭建本地MQTT服务器http://t.csdn.cn/aHNcO,现在介绍如何通过stm32连接MQTT 一.首先我们初始化esp8266这里我们使用的是USART4与其通信代码如下 二.通过数据间隔时间来判断是否是一串数据如果间隔时间大于30ms则判定为不是一串数据,接收缓冲器清零。 代码如下!

    2024年02月07日
    浏览(44)
  • STM32f103增加ESP8266模块,通过Wifi用手机TCP服务端远程与STM32通信

    提示:esp8266开启透传模式,连上路由器Wifi(电脑热点),接入STM32串口引脚。另外手机TCP服务端是手机IP地址+串口号(大于8000滴) 最近对ESP8266模块进行小了解,知道只要对8266通过串口发送AT指令进行配置其工作模式,就能够通过手机调试APP创建什么TCP/UDP服务端/客户端和8266进行

    2024年02月16日
    浏览(42)
  • STM32玩转物联网实战篇:2.ESP8266 WIFI模块TCP通信示例详解

    开发板功能区分布图 开发板俯视图     ESP8266 WIFI模块内置TCP/IP网络协议,模块支持三种网络模式,AP、STA和AP+STA模式,AP模式:模块作为WIFI热点,等待其他设备的连接,进行局域网的通信,STA模式:模块作为客户端通过路由器连接外网,和服务器进行通信,AP+STA模式:两

    2024年02月03日
    浏览(48)
  • 【STM32】ESP8266 WiFi模块实时上报温湿度及控制LED灯项目笔记

    本项目无线通讯模块使用的是WiFi模块ESP8266,乐鑫公司推出的高性能、低功耗串口WiFi模块ESP8266应该是使用最广泛的一种WIFI模块之一了,它自身带有高性能的MCU(Microcontroller Unit),因此它既可以通过串口连接为外部MCU提供 WiFi通信功能,也就是我们本项目所用到的功能;当然

    2024年01月21日
    浏览(51)
  • STM32驱动ESP8266连接阿里云(1)----使用AT指令连接阿里云

    购买的ESP8266一般没带MQTT固件,所以无法通过MQTT指令与云平台通信,需要烧录固件。 MQTT固件可以在安信可科技进行下载。 交流qun:6_15061293。 https://docs.espressif.com/projects/esp-at/zh_CN/release-v2.2.0.0_esp8266/index.html 下载器可以使用乐鑫官方的下载器。 https://www.espressif.com.cn/zh-hans/s

    2024年02月03日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包