STM32-ESP8266wifi模块实现

1.ESP8266WiFi模块介绍

1.1ESP8266wifi 模块

低功耗串口WiFi模块ESP8266内置一个Tensilica(泰思立达) Xtensa架构的32位处理器L106,具有5级流水线(ARM CortexM3是3级流水线),最大时钟速度为160MHz,可以使用高达16MB的外部SPI Flash。 该模块采用串口与MCU(或其他串口设备)通信,内置 TCP/IP协议栈,能够实现串口与 WIFI 之间的转换。通过该模块,传统的串口设备只需要简单的串口配置,即可通过WiFi传输自己的数据。
在这里插入图片描述
wifi模块具有两种模式:AP模式 、Station模式
AP模式:就是我们平常用的热点,如无线路由器,手机热点。
Station模式:就是我们连接这些热点的设备,如手机,iPad,笔记本电脑。

1.2AT命令介绍

我们想要与esp8266wifi模块进行通信,那么就需要AT命令进行。就好比我们要和英国国人进行交流时,我们就要用英语交流。在这里,就需要用到esp8266的AT指令进行和pc之间的通信。
AT 即Attention,它由拨号调制解调器(Modem)的发明者贺氏公司(Hayes)为了控制Modem发明的控制协议。协议本身采用文本,每个命令均以AT打头,因此得名。90年代初,AT指令仅被用于Modem操作。
几年后,主要的移动电话生产厂商诺基亚、爱立信、摩托罗拉和HP共同为GSM 研制了一整套AT指令,其中就包括对SMS的控制。AT指令在此基础上演化并被加入GSM 07.05标准以及现在的GSM07.07标准,其中拨打电话、收发短信、收发传真等全部由AT命令实现。而在随后的GPRS控制,3G模块,以及工业上常用的PDU,均采用AT命令集来控制,这样AT指令也就成为了完全标准化和比较健全的标准。

1.3AT命令格式

AT指令是以AT作为开头,\r\n字符结束的字符串,每个指令执行成功与否都有相应的返回。其他的一些非预期的信息(如有人拨号进来、线路无信号等),模块将有对应的一些信息提示,接收端可做相应的处理。

类型指令格式描述
执⾏指令AT+该命令⽤于执⾏受模块内部程序控制的变参数不可变的功能
测试指令AT+=?该命令⽤于该命令⽤于查询设置指令的参数以及取值范围
查询命令AT+?该命令⽤于返回参数的当前值
设置指令AT+=<…>该命令⽤于设置⽤户⾃定义的参数值

注意:不同模块的AT命令可能不一样的,这要对着模块的AT指令手册来查看。可以通过esp8266应答的信息来判断你们之间是否建立通信了。(每当发送一个AT指令之后,相应地就会在结尾给PC发 OK或者ERROR)

原理分析

下图是STM32开发板上预留的ESP8266模块接口,由此可知WiFi模块连到了CPU的USART2这个串口上。

在这里插入图片描述

配置使能串口USART1和USART2及中断。

按下CTRL+S生成代码。之后下篇博客会将代码实现写出来。
在这里插入图片描述

连接

如果我们用AT命令去操作ESP8266模块的话,我们就需要通过USART1,和USART2两个串口 桥接连接来实现通信.
在这里插入图片描述
我们通过两个串口来实现PC和ESP8266模块来发送AT指令。进而配置相应的内容。
1.AT+RST 重启、复位ESP8266命令
AT AT确认模块是否正常工作

在这里插入图片描述
2.AT+CWMODE_CUR=1 设置WiFi为Station模式和使能DHCP服务
在这里插入图片描述
这样我们就完成了通过AT指令来配置esp8266WiFi模块的station模式和使能DHCP服务;
然后我们就可以用AT指令去连接我们的路由器,刚才也说过station模式就是我们来连接热点的设备。连接之后我们就可以和局域网内的PC通过TCP连接进行通信。
3.AT+CWJAP_CUR=“输入WiFiID”,“输入路由器连接密码” 连接无线路由器
在这里插入图片描述
然后我们就可以TCP连接服务器进行数据通信。
在这里插入图片描述
4.AT+CIPSEND=5 发送5个字节数据等收到模块返回 > 后再输入5个字节数据将会通过WiFi模块发送出去。
在这里插入图片描述
我们通过”AT+CIPSEND=5“这条命令给ESP8266发送hello,然后可以收到TCP服务器发送回来的信息。所以说,AT命令对操作ESP8266来进行通信非常重要。至此我们完成了通过串口来发送AT命令来完成配置相关内容及TCP连接服务器。如有错误请留言指正,谢谢。

### 使用 HAL 库实现 STM32ESP8266 的 Wi-Fi 连接 为了使 STM32 能够通过 HAL 库与 ESP8266 建立 Wi-Fi 连接,主要工作集中在初始化 UART 接口以及编写用于发送 AT 指令的函数。下面提供了一个简单的示例来展示这一过程。 #### 初始化硬件资源 首先,在 `main.c` 文件中的 `MX_USARTx_UART_Init()` 函数里完成 USART 外设的初始化设置: ```c UART_HandleTypeDef huart1; 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(); } } ``` 此部分代码负责配置串行通信参数以便于后续的数据交换[^1]。 #### 编写辅助功能函数 接着定义几个帮助性的宏定义和全局变量用来简化命令传输流程,并创建两个重要的函数——一个是用于发送字符串形式的 AT 指令至 ESP8266;另一个则是等待来自设备端响应直到超时为止。 ```c #define CMD_BUFFER_SIZE 128 char cmd_buffer[CMD_BUFFER_SIZE]; // 发送AT指令 int send_at_command(const char *cmd, const char *expected_response, uint32_t timeout_ms){ int ret_val = -1; snprintf(cmd_buffer, sizeof(cmd_buffer), "%s\r\n", cmd); HAL_UART_Transmit(&huart1, (uint8_t*)cmd_buffer, strlen(cmd_buffer), HAL_MAX_DELAY); // 等待回应... while(timeout_ms--){ HAL_Delay(1); // 循环延时 /* 此处应加入接收处理逻辑 */ // 如果收到预期回复则成功退出循环 if(/* 收到了 expected_response */){ ret_val = 0; break; } } return ret_val; } // 示例:连接Wi-Fi网络 if(send_at_command("AT+CWMODE=1", "OK", 1000)==0 && send_at_command("AT+CWJAP=\"your_ssid\",\"your_password\"", "WIFI GOT IP", 5000)==0){ printf("Connected to WiFi successfully!\n"); } else { printf("Failed to connect.\n"); } ``` 上述代码片段展示了如何利用 HAL 库提供的 API 来构建基本框架,从而可以方便地向 ESP8266 下发各种类型的 AT 指令以达成特定目的,比如这里就是尝试接入指定 SSID 和密码组合下的无线局域网环境[^2]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值