ESP8266与STM32

本文详细介绍了ESP8266与STM32F103C8T6通过串口通信的过程,并演示了如何配置ESP8266在STA、AP及STA+AP模式下的操作指令,还提供了实现透传模式的方法。
该文章已生成可运行项目,

ESP8266与STM32通信

最近想实现esp8266-01s系列和stm32f103c8t6之间进行串口通信,然后在网上看了好多这方面的资料最终都以失败告终。不断尝试下还是实现该功能,同时非常感谢这位博主。
博主链接

实现的最终功能是能够通过手机连上ESP8266作为服务端模式下的wifi,让后在手机上发送相关的指令,esp8266接收后再通过串口发送给单片机 ,间接的来控制我们的外设。

esp8266常用指令介绍
具体的用法可以查看相关的esp8266的手册
下面就只介绍一下配置三种不同模式常用的几个指令

在这里插入图片描述在这里插入图片描述在这里插入图片描述

模式一:STA模式

 //通俗的来讲 该模式就是将esp8266作为客户端 来连接服务端(可以通过我们手机开热点)
 1. AT+CWMODE=1                    设置模组为STA模式。(串口助手)
 2. AT+CWLAP                 	   查询附近 WIFI(串口助手)
 3. AT+CWJAP="nova5Pro","yin12345"   连接 WIFI(串口助手)
 4. AT+CIFSR                       查看路由器分配给模组的IP地址,例如 192.168.43.20(串口助手)
 5. AT+CIPMUX=1                    打开多连接(串口助手)
 6. AT+CIPSERVER=1,8080         设置模块服务器端口(串口助手).
 7. 打开网络调试助手进行设置:请打开电脑去连接路由器的WIFI热点。并且打开网络调试助手,在网络调试助手上输入连接模块的 IP和设置的端口。
 8. AT+CIPSEND=0,11                进入数据发送模式为11个字节

在电脑终端查看当前Ip ipconfig

在这里插入图片描述记住该Ip在我们配置的时候会使用到 让后通过网络串口助手打开服务端 在使用另外一个串口助手打开就可以观察到我们客户端的启动情况 和 二者之间的数据收发 在esp8266.c中 打开我最开始注释的就可以了
在这里插入图片描述

模式二:AP 模式

//AP模式就是让我们的8266模块作为热点 让我们来连接 实现局域网的无线控制
 1.  AT+CWMODE=2                              开启 AP 模式(串口助手)
 2.  AT+CWSAP="ESP8266","12345678",11,0     设置模块的 wifi 和密码(串口助手)
 3.  AT+CIPSERVER=1,8080                     设置模块服务器端口(串口助手),
 4.  打开电脑或者手机上的TCP助手去连接模块建立的AP热点
 5.  打开网络调试助手,输入连接模块的 ip 和设置的端口。
 6. AT+CIFSR       查看当下的ip 
 7.  AT+CIPSEND=0,11                          进入数据发送模式为11个字节(串口助手)

下面串口打印出来的信息就可以观察到我们的配置已经成功了
并且可以看到esp8266作为服务端下的IP,我们通过手机或者网络串口助手连接 
输入该IP和我们配置的端口号就可以了
注意:

在这里插入图片描述

通信连接

在这里插入图片描述上面就实现了简单的通信

模式三:STA+AP 模式

该模式就是上面两种模式的共存模式,一般没有用到 就不做具体介绍了感兴趣的同学可以自己去试试。

最后在讲一下透传模式

透传模式简单的来说就是实现我们发送的数据,发送什么另一端就接收什么,可以一直发送。
如果不开启透传模式,发送数据前都必须先发送指令AT+CIPSEND=num,
例如T+CIPSEND=4  //发送的数据长度不能大于4 要不然在次发送的时候句处于忙的状态。

AT+CIPMODE=<1> :进入透传模式
AT+CIPSEND :之后发送的所有内容将全部当成数据
注意:透传只能在单连接模式下进行,所以在建立连接之前一定要用(AT+CIPMUX=0 设置单连接)
退出透传模式: 发送数据"+++"就可以了。注意:此时“+++”后面,不接“发送新行”!

c 主程序

/***************************************************/
//该程序还是借鉴前面提到的博主,后面会根据自己功能的需求进行相应的修改

#include "stm32f10x.h"
#include "bsp_usart.h"
#include "delay.h"
#include "led.h"
#include "usart3.h"
#include "string.h"
#include "esp8266.h"
/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{	
  USART_Config();
	delay_init();
	LED_Init();
	
	usart3_init(115200);

	esp8266_start_trans();	
	
	printf("初始化完成Start Test\n");
	
	USART3_RX_STA=0;
  while(1)
	{	

    if(USART3_RX_STA&0x8000)    //如果消息接收完成,则处理
		{
			if(strstr((const char*)USART3_RX_BUF,"on"))  //这里是看接收到的消息中有没有自己设置的命令“on”,strstr()函数不会用的可以搜一下
				{
					GPIO_ResetBits(GPIOC,GPIO_Pin_13);
				}
			if(strstr((const char*)USART3_RX_BUF,"off")) 
			{
				GPIO_SetBits(GPIOC,GPIO_Pin_13);
			}
			USART3_RX_STA=0;   //消息处理完成,开始重新接收
			memset(USART3_RX_BUF,0,600);         //将接收区清0
		}

	}	
}
/*********************************************END OF FILE**********************/

源码链接 链接:https://pan.baidu.com/s/1YwXKHYdV_wxlAYa7eDA7vQ 提取码:avug --来自百度网盘超级会员V4的分享

本文章已经生成可运行项目
### STM32ESP8266之间通过串口实现数据交换 #### 硬件连接方式 为了使STM32能够ESP8266正常通信,两者间的硬件连接至关重要。通常情况下,需要将STM32的USART TX引脚连接到ESP8266的RXD引脚;同样地,STM32的RX引脚应连接至ESP8266的TXD引脚[^1]。 另外值得注意的是,由于部分型号的ESP8266工作电压为3.3V逻辑电平,而某些STM32系列可能支持5V耐受输入或同样是3.3V逻辑电平,在这种情况下可以直接相连而不必担心损坏设备。然而如果存在不兼容情况,则需采用合适的电平转换电路来确保信号传输的安全性和准确性。 #### 软件编程接口配置 对于软件方面而言,主要涉及到初始化设置以及发送接收函数编写两大部分: - **初始化设置** 在开始之前要先完成对STM32内部USART外设的相关参数设定,比如波特率、停止位数等。这里假设已经完成了基本的库文件引入和必要的头文件声明等工作之后,可以按照如下方式进行初始化操作: ```c // 初始化USART端口 void USART_Init(void){ // 配置GPIO模式, 设置对应的引脚功能为复用推挽输出/浮空输入 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // PA9-TX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // PA10-RX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART参数 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1,&USART_InitStructure); // 开启中断并允许接收中断请求 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 启动USART USART_Cmd(USART1,ENABLE); } ``` 上述代码片段展示了如何针对特定的MCU(如STM32F1xx)及其上的USART1进行基础性的初始化配置过程。 - **发送接收函数编写** 当准备就绪后就可以着手于具体的收发处理了。下面给出了一组简单的例子用于说明怎样向ESP8266发送命令字符串以及从其处获取响应信息的方法: ```c #include "usart.h" char buffer[64]; // 缓冲区大小可根据实际需求调整 // 发送AT指令给ESP8266 void Send_AT_Command(char *cmd){ while(*cmd != '\0'){ USART_SendData(USART1,*cmd++); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}; } } // 接收来自ESP8266的信息 uint8_t Receive_Data_From_ESP(){ uint8_t i=0; char ch; do{ if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET){ ch = USART_ReceiveData(USART1); buffer[i++] = ch; if(ch=='\r'||ch=='\n') break; } }while(i<sizeof(buffer)-1); buffer[i]='\0'; return i>0?i:0; } ``` 以上两个辅助函数分别实现了向ESP8266发送指定字符序列的功能以及等待直到接收到完整的回应为止的过程。
评论 527
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

华阳电子工作室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值