ESP8266 wifi模块代码详解

本文介绍了如何在STM32与ESP8266模块间通过串口通信发送AT指令,实现ESP8266模块的命令控制,包括初始化步骤、串口配置、数据发送与接收、ESP8266命令发送验证等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ESP8266 模块

  最后代码已上传!!!!
  代码文章链接
   github 代码链接在该文章最后

文章目录

硬件使用

  • STM32F103 RCT6
  • ESP8266 (WiFi 模块)

软件使用

  • keil5 MDK环境
  • 串口调试助手

实现说明

​   通过 ESP8266 中 AT 手册可知,可以通过 AT 指令让 ESP8266 模块执行对应命令。

​    那如何发送数据给 ESP8266 模块呢?

​   没错,就是通过串口发送数据!

1. 第一步就是要初始化串口
  **注意:** STM32 的 Tx 连 ESP8266模块的 Rx, STM32 的 Rx 连 ESP8266模块的 Tx ,==查询 STM32 手册可以了解==
void Usart2_Init(unsigned int baud)
{
	GPIO_InitTypeDef gpio_initstruct;
	USART_InitTypeDef usart_initstruct;
	NVIC_InitTypeDef nvic_initstruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);		//使能GPIOA
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);		//使能 USART2
	
	gpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP;				//复用推挽输出
	gpio_initstruct.GPIO_Pin = GPIO_Pin_2;						//PA2	TXD
	gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &gpio_initstruct);
	
	gpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;			//浮空输入
	gpio_initstruct.GPIO_Pin = GPIO_Pin_3;						//PA3	RXD
	gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &gpio_initstruct);
	
	usart_initstruct.USART_BaudRate = baud;						//设置波特率
	usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	//无硬件流控制
	usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;		//设置 串口模式,接受和发送
	usart_initstruct.USART_Parity = USART_Parity_No;					//无校验位
	usart_initstruct.USART_StopBits = USART_StopBits_1;					//无停止位
	usart_initstruct.USART_WordLength = USART_WordLength_8b;							//8位数据位
	USART_Init(USART2, &usart_initstruct);
	
	USART_Cmd(USART2, ENABLE);										//使能串口
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);						//使能接受中断
	
	nvic_initstruct.NVIC_IRQChannel = USART2_IRQn;
	nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;
	nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0;
	nvic_initstruct.NVIC_IRQChannelSubPriority = 0;
	NVIC_Init(&nvic_initstruct);

}
```
2.设置串口中断
void USART2_IRQHandler(void)
{
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断 
	{
		if(esp8266_cnt >= sizeof(esp8266_buf))	esp8266_cnt = 0; //防止串口被刷爆,设置一个 esp8266缓冲区的长度 = esp8266_cnt
		esp8266_buf[esp8266_cnt++] = USART2->DR;		//USART2->DR 表示串口循环发送缓冲区数据
		USART_ClearFlag(USART2, USART_FLAG_RXNE);		//清除 USARTx 的待处理标志位,一定要用
	}
}
3.定义串口发送函数

原本串口只能发送一个字符,要编写函数发送字符串

void Usart2_SendString(unsigned char *str, unsigned short len)
{
	unsigned short count = 0;
	for(; count < len; count++)
	{
		USART_SendData(USART2, *str++);									//发送数据
		while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);		//等待发送完成,每发送一位数据,USART_FLAG_TC = SET,跳出循环
	}
}
4.ESP8266发送命令数据
_Bool ESP8266_SendCmd(char *cmd, char *res, u16 time)			//_Bool 为自定义数据,可以采取宏定义方式
{	
	Usart2_SendString((unsigned char *)cmd, strlen((const char *)cmd));//串口发送数据
	while(time--)
	{
		if(ESP8266_WaitRecive() == REV_OK)							//发送是否完成  
		{
			if(strstr((const char *)esp8266_buf, res) != NULL)		//检索到关键词(根据 AT 指令手册可以查询到 输入不同命令,所返回不同的值)
			{
				ESP8266_Clear();									//清空ESP8266串口缓存	
				return 0;
			}
		}
		delay_ms(10);
	}
	return 1;
}

​判断是否发送命令是否成功函数解释

_Bool ESP8266_WaitRecive(void)
{
	if(esp8266_cnt == 0) 							//如果发送命令数据长度为0
		return REV_WAIT;							//REV_WAIT=1
        
	if(esp8266_cnt == esp8266_cntPre)				//判断上一次命令数据长度和这一次相等,长度赋值为USART2_IRQHandler 串口中断函数中	esp8266_buf[esp8266_cnt++] = USART2->DR; 语句在 esp8266_cnt++ ,自增中完成赋值
	{
		esp8266_cnt = 0;							//将 esp8266_cnt 置为0	
		return REV_OK;								//REV_OK = 0
	}		
	esp8266_cntPre = esp8266_cnt;					//一般使用该函数,都是使用 while 循环语句,第一次收到的命令数据长度,赋值给 esp8266_cntPre,再一次进入该函数,再进行上个 if判断
	return REV_WAIT;								//返回 1 ,表示循环继续
}
5.发送想要发送的任意字符函数
void ESP8266_SendData(unsigned char *data, unsigned short len)
{
	char cmdBuf[32];
	ESP8266_Clear();								//清空缓存
	sprintf(cmdBuf, "AT+CIPSEND=%d\r\n", len);		//AT 指令中关于发送字符串的命令
	if(!ESP8266_SendCmd(cmdBuf, ">", 200))			//AT 指令中 ESP8266 收到该命令后应该收到‘>’
	{
		Usart2_SendString(data, len);				//收到该命令后可以 通过串口发送字符串了
	}
}
6.ESP8266 模块初始化
void ESP8266_Init(void)
{
	ESP8266_Clear();
	
	printf("AT\r\n");
	while(ESP8266_SendCmd("AT\r\n\r", "OK", 200))			//AT 指令测试 模块是否正常
		delay_ms(500);
	
	printf("CWMODE\r\n");
	while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK", 200))	//设置成 STA 模式
	delay_ms(500);
	printf("AT+CWDHCP\r\n");								//串口调试打印相关信息						
	while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK", 200))	//STA 运行 DHCPC,使得运行 DHCPC  设备具有上网的能力,后面一个 1 ,代表设置成 STA,前面一个 1 代表开启 DHCP,DHCP 是自动给内网机器分配 IP 地址的协议!
	delay_ms(500);
	printf("CWJAP\r\n");																					
	while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP", 200))	//连接热点,#define ESP8266_WIFI_INFO		"AT+CWJAP=\"手机热点名字\",\"手机热点密码\"\r\n",设置更改为自己的
	delay_ms(500);
	printf("CIPSTART\r\n");
	
	while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT", 200))	//连接 ONENET,#define ESP8266_ONENET_INFO		"AT+CIPSTART=\"TCP\",\"183.230.40.39\",6002\r\n" 这是 ONE-NET 平台提供的 IP 地址和 端口号,建议更改为自己的 电脑 IP ,和随机端口号,端口号建议为 8000-10000之内的数字
	delay_ms(500);
	printf("ESP8266 Init OK\r\n");													
}

最后

 第一次尝试编写博客,若是有什么建议,欢迎批评指出。

后续会逐步分块更新,并会在最后一篇文章上传源代码。

  最后一篇文章已更新,代码在该篇文章最后

  一文带你了解 MQTT 协议 代码在该文章最后

 若是该文章对你有作用或是觉得文章写得还行,帮忙点点赞,三连!

### ESP8266 Keil 示例代码下载及相关说明 ESP8266 是一款功能强大的 Wi-Fi 芯片,广泛应用于物联网设备中。然而需要注意的是,ESP8266 的开发通常基于 Arduino IDE 或者 Espressif 提供的 SDK(如 ESP-IDF),而并非直接通过 Keil 进行开发[^3]。 尽管如此,如果希望在 STM32 平台上利用 Keil 工程实现对 ESP8266 的控制,则可以通过 UART 接口与 ESP8266 模块通信来完成特定的功能需求。以下是关于如何获取适用于 ESP8266STM32 结合使用的示例代码的方法: #### 获取方法 1. **官方资源库** 访问 Espressif 官方网站或者 GitHub 仓库,查找针对不同平台的示例代码集合。虽然这些代码可能不是专门为 Keil 设计,但可以作为参考进行移植和修改[^4]。 2. **社区分享** 在一些技术论坛或开发者社区(例如 CSDN、电子发烧友网等)上搜索关键词“ESP8266 Keil 示例代码”,可能会找到由其他开发者上传的相关工程文件[^5]。 3. **自定义编** 如果无法找到现成的 Keil 工程,可以根据实际应用场景自行编驱动程序。以下是一个简单的框架结构用于启动和配置 ESP8266 模块: ```c #include "stm32f10x.h" void USART_Config(void); void Send_AT_Command(char *command); int main(void) { USART_Config(); // 初始化USART外设 while (1) { Send_AT_Command("AT+RST"); // 发送重启命令给ESP8266模块 Delay_ms(1000); // 延迟等待响应 } } // 配置串口函数 void USART_Config() { GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART1, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; // TX Pin GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; // RX Pin GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStruct); USART_InitStruct.USART_BaudRate = 115200; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStruct); USART_Cmd(USART1, ENABLE); } ``` 上述代码展示了如何初始化 STM32 的 USART 外设并与 ESP8266 模块建立基本连接关系[^6]。 --- ### 注意事项 - 确保硬件连线正确无误,特别是 VCC、GND、TX/RX 引脚之间的对应关系。 - 根据具体型号调整波特率参数以匹配目标模组的工作状态。 - 测试过程中建议配合逻辑分析仪或其他调试工具监控信号波形以便及时发现问题所在。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丿轩雪灬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值