文章目录
一.概要
ESP8266 是一款高性能的 WIFI 串口模块,实现透明传输。只要有一定的串口知识,不需要知道 WIFI 原理就可以上手,在业内应用广泛。
ESP8266 是一个非常强大的 WIFI 模块,可以利用串口与单片机进行通讯,从而编程实现控制 ESP8266。利用 ESP8266 可以访问电脑服务器实现TCP/IP协议通讯。
该系列模块支持标准的IEEE802.11b/g/n协议,内置完整的TCP/IP协议栈。用户可以使用该系列模块为现有的设备添加联网功能,也可以构建独立的网络控制器。
二.ESP8266 WIFI模块主要性能参数
1.最小的 802.11b/g/n Wi-Fi SOC 模块
2.采用低功率32位CPU,可兼作应用处理器
3.主频最高可达160MHz
4.内置 10 bit 高精度 ADC
5.支持UART/GPIO/IC/PWM/ADC/HSPI等接口
6.集成 Wi-FiMAC/ BB/RF/PA/LNA
7.支持多种休眠模式,深度睡眠电流低至20uA
8.内嵌 Lwip 协议栈
9.支持STA/AP/STA+AP 工作模式
10.支持 Smart Config/AirKiss;一键配网
11.串口速率最高可达4Mbps
12.通用 AT 指令可快速上手
13.支持 SDK 二次开发
14.支持串口本地升级和远程固件升级(FOTA)
模块接口说明:
1.TX 模块UART串口发送脚
2.GND 接地
3.EN 芯片使能端,高电平有效
4.IO2 GPIO脚
5.RST 模块复位脚
6.IO0 模式选择脚,下载模式:外部拉低;运行模式:悬空或者外部拉高
7.3V3 3.3V 供电,外部供电电源输出电流建议在500mA以上
8.RX 模块UART串口接收脚
三.ESP8266 WIFI模块芯片内部框图
ESP8266 是高性能无线 SoC,以最低成本提供最大实用性,为 Wi-Fi 功能嵌入其他
系统提供无限可能。
ESP8266 拥有完整的且自成体系的Wi-Fi网络功能,既能够独立应用,也可以作为从
机搭载于其他主机MCU运行。当ESP8266独立应用时,能够直接从外接flash中启动。
内置的高速缓冲存储器有利于提高系统性能,并且优化存储系统。
另外⼀种情况是, ESP8266 只需通过 SPI/SDIO 接口或 UART 接口即可作为 Wi-Fi
适配器,应用到基于任何微控制器设计中。
ESP8266 强大的片上处理和存储能力,使其可通过GPIO口集成传感器及其他应用的
特定设备,大大地降低了前期开发的成本。
四.ESP8266 WIFI模块原理图
五.ESP8266 WIFI模块与单片机通讯方法
1.硬件连接
一般模块不需要固件下载更新,单片机通过串口跟模块通讯就能连接路由器,单片机跟模块通常连接如下:
2.ESP8266模块AT指令介绍
在ESP8266的开发过程中,AT指令方法是最常用的方法,无需花大量的时间去熟悉环境,开发速度快。
AT指令是一种串口通信协议,是以AT开头的一个字符串,每个指令执行成功与否都有相应的返回,都是ASCII码字符串操作,每个发送的AT指令都需要回车换行符结束。
最常见的就是AT指令就是查询模块通讯是否正常,指令如下:
单片机发送:AT+(回车换行符)
模块响应:OK
ESP8266模块的主要AT指令如下:
串口波特率115200,8位数据,1位停止位,无校验
ESP8266配置成客户端模式,登录电脑服务器端口主要AT指令流程
六.STM32单片机与ESP8266WIFI模块通讯实验
1.硬件准备
STLINK接STM32F103C8T6小系统板,STLINK接电脑USB口。
板子与ESP8266通过5根杜邦线相连
板子G----模块第2脚(GND)
板子3.3–模块第7脚(3V3)
板子A2—模块第8脚(RX)
板子A3—模块第1脚(TX)
板子C13–模块第5脚(RST)
2.软件工程
打开STM32CubeMX软件,新建工程
Part Number处输入STM32F103C8,再双击就创建新的工程
配置下载口引脚
配置外部晶振引脚
配置系统主频
配置USART2
配置USART2中断,和PC13引脚为输出,PC13引脚控制模块复位脚
配置工程文件名,保存路径,KEIL5工程输出方式
生成工程
用Keil5打开工程
添加代码
3.软件主要代码
串口数据接收相关代码
volatile uint8_t UartRxData;
uint8_t UartTxbuf[1000]={1,2,3,4,5,6,7,8,9,10};
uint8_t UartRxbuf[1024],UartIntRxbuf[1024];
uint16_t UartRxIndex=0,UartRxFlag,UartRxLen=0,UartRxTimer,UartRxOKFlag,UartIntRxLen;
//串口清除
uint8_t UartRecv_Clear(void)
{
UartRxOKFlag=0;
UartRxLen=0;
UartIntRxLen=0;
UartRxIndex=0;
return 1;
}
//接收标志函数,返回0说明没收据接收,返回1说明有数据收到
uint8_t Uart_RecvFlag(void)
{
if(UartRxOKFlag==0x55)
{
UartRxOKFlag=0;
UartRxLen=UartIntRxLen;
memcpy(UartRxbuf,UartIntRxbuf,UartIntRxLen);//把缓冲区的数据,放入需要解析的数组
UartIntRxLen=0;
TcpClosedFlag = strstr (UartRxbuf, "CLOSED\r\n" ) ? 1 : 0;
return 1;
}
return 0;
}
//串口2在1字节接收完成回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart==&huart2)//判断是否串口2
{
UartRxFlag=0x55;//接收标志置位
UartIntRxbuf[UartRxIndex]=UartRxData;//数据写入缓冲区
UartRxIndex++;//记载数目加1
if(UartRxIndex>=1024)//缓冲区是1024字节,如果存满,归零
{
UartRxIndex=0;
}
HAL_UART_Receive_IT(&huart2,(unsigned char*)&UartRxData,1);//继续接收下一字节
}
}
//1ms调用一次,用来判断是否收完一帧
void UART_RecvDealwith(void)
{
if(UartRxFlag==0x55)
{
if(UartIntRxLen<UartRxIndex)//UartIntRxLen小于UartRxIndex,说明有收到新的数据,把接收长度增加
{
UartIntRxLen=UartRxIndex;
}else
{
UartRxTimer++;
if(UartRxTimer>=50)//50ms,等待,没收到新数据,说明已经收完一帧
{
UartRxTimer=0;
UartRxFlag=0;
UartRxOKFlag=0x55;
UartRxIndex=0;
}
}
}
}
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
UART_RecvDealwith();
/* USER CODE BEGIN SysTick_IRQn 1 */
/* USER CODE END SysTick_IRQn 1 */
}
/**
* @brief This function handles USART2 global interrupt.
*/
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
/* USER CODE END USART2_IRQn 1 */
}
main函数代码
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart2, (uint8_t *)&UartRxData, 1);//接收中断使能
ESP8266_Init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
ESP8266_STA_TCPClient_Test();//测试TCP通讯
}
/* USER CODE END 3 */
}
ESP8266配置相关
#define User_ESP8266_SSID "CMCC-DAX7" //wifi名
#define User_ESP8266_PWD "13588084246" //wifi密码
#define User_ESP8266_TCPServer_IP "192.168.10.11" //服务器IP
#define User_ESP8266_TCPServer_PORT "8888" //服务器端口号
char str[100]={0};
ESP8266_AT_Test();
printf("正在配置ESP8266\r\n");
ESP8266_Net_Mode_Choose(STA);
while(!ESP8266_JoinAP(User_ESP8266_SSID, User_ESP8266_PWD));
ESP8266_Enable_MultipleId ( DISABLE );
while(!ESP8266_Link_Server(enumTCP, User_ESP8266_TCPServer_IP, User_ESP8266_TCPServer_PORT, Single_ID_0));
while(!ESP8266_UnvarnishSend());
printf("\r\n配置完成");
while ( 1 )
{
sprintf (str,"杭州光子物联科技有限公司" );//格式化发送字符串到TCP服务器
ESP8266_SendString ( ENABLE, str, 0, Single_ID_0 );
HAL_Delay(200);
Uart_RecvFlag();//接收数据
if(TcpClosedFlag) //判断是否失去连接
{
ESP8266_ExitUnvarnishSend(); //退出透传模式
do
{
res = ESP8266_Get_LinkStatus(); //获取连接状态
}
while(!res);
if(res == 4) //确认失去连接,重连
{
while (!ESP8266_JoinAP(User_ESP8266_SSID, User_ESP8266_PWD ) );
while (!ESP8266_Link_Server(enumTCP, User_ESP8266_TCPServer_IP, User_ESP8266_TCPServer_PORT, Single_ID_0 ) );
}
while(!ESP8266_UnvarnishSend());
}
}
//对ESP8266模块发送AT指令
// cmd 待发送的指令
// ack1,ack2;期待的响应,为NULL表不需响应,两者为或逻辑关系
// time 等待响应时间
//返回1发送成功, 0失败
bool ESP8266_Send_AT_Cmd(char *cmd,char *ack1,char *ack2,u32 time)
{
UartRecv_Clear(); //重新接收新的数据包
ESP8266_USART("%s\r\n", cmd);
if(ack1==0&&ack2==0) //不需要接收数据
{
return true;
}
HAL_Delay(time); //延时
HAL_Delay(1000);
if(Uart_RecvFlag()==1)
{
UartRxbuf[UartRxLen]='\0';
}
if(ack1!=0&&ack2!=0)
{
return ( ( bool ) strstr ( (const char*)UartRxbuf, ack1 ) ||
( bool ) strstr ( (const char*)UartRxbuf, ack2 ) );
}
else if( ack1 != 0 ) //strstr(s1,s2);检测s2是否为s1的一部分,是返回该位置,否则返回false,它强制转换为bool类型了
return ( ( bool ) strstr ( (const char*)UartRxbuf, ack1 ) );
else
return ( ( bool ) strstr ( (const char*)UartRxbuf, ack2 ) );
}
4.实验效果
电脑TCP服务器收到WIFI的登录信息还有单片机发出的数据
七.CubeMX工程源代码下载
链接:https://pan.baidu.com/s/1okCg_2S222ugDzX70WaFVw
提取码:gx8l
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行
八.小结
ESP8266 WIFI模块具备强大的功能,能够实现与网络的无缝通信。它特别适用于物联网领域,能够轻松地通过串行通信接口与STM32单片机连接,为智能家居、智能照明、智能车辆等多种应用场景提供解决方案。
标签:CODE,ESP8266,WIFI,STM32,源码,USER,模块,串口 From: https://blog.csdn.net/zy2232652/article/details/140705052