STM32 (十五)ESP8266WIFI

news2024/11/18 3:49:29

简介

1 ESP8266wifi 模块

低功耗串口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,笔记本电脑。

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指令也就成为了完全标准化和比较健全的标准。

3AT命令格式

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

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

4 常用的AT指令

这里讲解一下我们ESP8266 01S常用的AT指令:

4.1.AT+RST

重启、复位ESP8266命令

4.2.AT

AT确认模块是否正常工作

4.3.AT+CWMODE_CUR=1

设置WiFi为Station模式和使能DHCP服务

4.4 AT+CWJAP_CUR=“输入WiFiID”

输入路由器连接密码” 连接无线路由器

4.5 AT+CWJAP_CUR=“输入WiFiID”

4.6 AT+CIPSERVER=1,8080",

设置端口8080

工程创建

1 高速时钟选择外部8Mhz的晶振

2 开启debug调试功能

3 时钟树

4 打开串口2设置

5 并且使能串口中断

6.选择LED

7选择MDK_ARM编译器

8生成文件库的选择

代码讲解:

代码修改

1 添加My_esp8266.c

#include "My_esp8266.h"
#include "string.h"
#include "usart.h"
 
void u2_printf(char* fmt);
char esp8266_send_cmd(char *cmd,char *ack,u16 waittime); 
 
 
void esp8266_test(void)//测试
{
if(esp8266_send_cmd("AT","OK",50));
 
}
 
char esp8266_send_cmd(char *cmd,char *ack,u16 waittime)//发送指令和检查接收
{
 
    u2_printf(cmd);
    
    if(ack&&waittime)        
    {
            while(--waittime)    
            {
                HAL_Delay(10);
                if(strstr((const char*)RxBuffer,(const char*)ack)) //输入on,LED0亮
                {
                    Uart2_Rx_Cnt=0;
                    memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组    
                    return 1;
         
                }
            }
 
    }
 
    return 0;
}
 
 
void esp8266_start_trans(void)//ESP8266初始化
{
    
    esp8266_send_cmd("AT+CWMODE=2","OK",50);//设置为AP模式
 
    esp8266_send_cmd("AT+RST","ready",20);//重启
    
    HAL_Delay(1000);       
    HAL_Delay(1000);
    HAL_Delay(1000);
    HAL_Delay(1000);
    
    esp8266_send_cmd("AT+CWSAP=\"ESP8266\",\"12345678\",1,4","OK",200);//设置WiFi名称、密码,模式
    esp8266_send_cmd("AT+CIPMUX=1","OK",20);//进入透传模式
    esp8266_send_cmd("AT+CIPSERVER=1,8080","OK",200);//设置端口8080
    esp8266_send_cmd("AT+CIPSEND","OK",50);//开始发送数据
}
 
uint8_t esp8266_quit_trans(void)//退出透传模式
{
    uint8_t result=1;
    u2_printf("+++");
    HAL_Delay(1000);                    
    result=esp8266_send_cmd("AT","OK",20);
    return result;
 
}
 
 
void u2_printf(char* fmt)  
{  
 
    uint8_t num=0;
  char my_ch[50]={0};
    while(*fmt!=0)
    my_ch[num++]=*fmt++;
    
    my_ch[num++]='\r';
    my_ch[num++]='\n';
    
    HAL_UART_Transmit(&huart2, (uint8_t *)my_ch,num, 0xffff);
   while(HAL_UART_GetState(&huart2) == HAL_UART_STATE_BUSY_TX);
 
}
 
 


2.添加My_esp8266.h

#ifndef __My_esp8266_H__
#define __My_esp8266_H__
 
#include "main.h"
 
typedef uint16_t u16  ;
 
 
extern void esp8266_test(void);
extern void u2_printf(char* fmt);
extern char esp8266_send_cmd(char *cmd,char *ack,u16 waittime); 
extern void esp8266_start_trans(void);
 
#endif

3.main.h的Exported types中添加代码

/* USER CODE BEGIN ET */
extern char RxBuffer[256];
extern uint8_t Uart2_Rx_Cnt;
/* USER CODE END ET */

4.main.c的Private includes中添加代码

/* USER CODE BEGIN Includes */
#include <string.h>
#include "My_esp8266.h"
/* USER CODE END Includes */

5. main.c的Private variables中添加代码

/* USER CODE BEGIN PV */
#define RXBUFFERSIZE  256     //最大接收字节数
char RxBuffer[RXBUFFERSIZE];   //接收数据
uint8_t aRxBuffer;            //接收中断缓冲
uint8_t Uart2_Rx_Cnt = 0;        //接收缓冲计数
uint8_t my_test_v = 0 ;
char my_order[15]={0};
char receive_flag=0;
/* USER CODE END PV */

6.main.c主函数下面的USER CODE BEGIN 4下面添加中断回调函数,如下

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */
 
    if(Uart2_Rx_Cnt >= 255)  //溢出判断
    {
        Uart2_Rx_Cnt = 0;
        memset(RxBuffer,0x00,sizeof(RxBuffer));            
    }
    else
    {
        static uint8_t Uart2_count=0;
        
        RxBuffer[Uart2_Rx_Cnt] = aRxBuffer;   //接收数据转存
        if(receive_flag==0)
        {
        if(RxBuffer[Uart2_Rx_Cnt-Uart2_count]=='<')
        {    
            Uart2_count++;
        if((RxBuffer[Uart2_Rx_Cnt]=='>')||Uart2_count>=14)
        {
            uint8_t My_i=0;
        for(int i=Uart2_Rx_Cnt-Uart2_count+1;i<Uart2_Rx_Cnt+1;i++)
            my_order[My_i++]=RxBuffer[i];
            receive_flag=1;
            Uart2_count=0;
        }
    }
    }
        Uart2_Rx_Cnt++;
    }
    
    HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
}
/* USER CODE END 4 */

7.主函数代码

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_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET );
HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);
esp8266_start_trans();
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
     //     HAL_Delay(20);
        if(receive_flag)
    {
        receive_flag=0;
        if(strstr((const char*)my_order,(const char*)"<on>")) //输入on,LED0亮
        {
            Uart2_Rx_Cnt=0;
            memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组    
            memset(RxBuffer,0x00,sizeof(my_order)); //清空数组    
            my_test_v=1;
        }
        else if(strstr((const char*)my_order,(const char*)"<off>"))
        {
                    Uart2_Rx_Cnt=0;
            memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组    
            memset(RxBuffer,0x00,sizeof(my_order)); //清空数组    
          my_test_v=0;
        }
        else
            {
            Uart2_Rx_Cnt=0;
            memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组    
            memset(RxBuffer,0x00,sizeof(my_order)); //清空数组    
        
        }
            
     }
        if(my_test_v==1)    
            HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET );
        else
          HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET );
            
    /* USER CODE END WHILE */
 
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

手机端控制

1.esp8266和核心板的连接只需要四个引脚,vcc(3.7—5v的稳定电源,不稳定的话会不断重启),gnd,rx,tx。其中,模块的rx接核心板的tx,tx接核心板的rx。

2. 初始化(4s)后,模块就会发出名字为esp8266的热点,密码为12345678。

3 手机接入后打开“tcp连接”app(这个热点没有网络,有些手机连接后一会儿后自动就断开了,所以要设置下,我是直接把数据流量关了就行了)

4 连接(IP地址一般是192.168.4.1不正确的话需要用串口助手给wifi模块发送AT指令查看连接设备的地址,当然也可以程序上发送后在线调试看数组)

5 发送数据,记住要加英文输入法的“<>”,就能控制灯的亮灭了。

需要注意的是,esp8266wifi模块相当于一个下好程序的核心板,你只需要通过给它发送串口的AT指令来进行控制它的各种动作。初始化也不是对引脚初始化,是通过串口对它发送AT指令。所以初始化后如果不给esp8266断电的话是不用再次初始化的,因为每次初始化后重启会话4s的时间,所以想不断下程序来调试的话,可以把初始化函数(esp8266_start_trans();)注释了,就不用每次都额外等4s的时间了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kotlin Navigation开发

前言 其实小编之前一直都是用的Java来开发Android&#xff0c;但是工作需求&#xff0c;开始了Kotlin的编程&#xff0c;接触到了JetPack&#xff0c;发现其中的Navigation特别有意思&#xff0c;今天来给大家分享一下&#xff0c;我们做一个四个页面吧&#xff0c;从APP的 欢…

2023年PMP考试如何备考?

下面我给各位正在学习备考或者正在犹豫是否报名的朋友分享下我的想法和学习经验&#xff0c;希望对各位朋友有帮助。 一&#xff0c; 关于读PMBOK 在整个学习和备考期间我总共读了五遍PMBOK&#xff0c;第一遍是粗略的读&#xff0c;在读的时候一定要有耐心&#xff0c;因为在…

电商系统的高质量容量保障是怎样“炼成”的?

一分钟精华速览 容量保障的目标是保证服务在大量用户访问时&#xff0c;依然可以正常为用户提供服务。比如&#xff0c;在“双11”购物节的超高访问量下&#xff0c;各电商系统依然能够稳定地运行&#xff0c;可以说容量保障是所有技术人都应当具备的技能。 知名技术博主老张…

【0-1背包变式题】何以包邮(来自Acwing寒假每日一题)

⭐️前面的话⭐️ 本篇文章介绍来自一道0-1背包的变式原题&#xff0c;展示语言java/C。 &#x1f4d2;博客主页&#xff1a;未见花闻的博客主页 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4cc;本文由未见花闻原创&#xff0c;…

振弦采集模块监测传感器频率值不稳定

振弦采集模块监测传感器频率值不稳定 基本概念 振弦传感器&#xff1a;&#xff08;vibrating wire sensor&#xff09;是以拉紧的金属钢弦作为敏感元件的谐振式传感器。当弦的长度确定之后&#xff0c;其固有振动频率的变化量即可表征钢弦所受拉力的大小。根据这一特性原理&a…

2023华数杯B题社会稳定预警研究的材料支撑以及解题思路【全网独家社会稳定预警研究材料支撑】

B题社会稳定预警研究 材料支撑&#xff1a;&#xff08;动态链接&#xff0c;后期会一直不断新增支撑论文进去&#xff09; 社会稳定预警研究材料支撑合集下载 部分截图如下&#xff1a;&#xff08;还会不断更新&#xff09; 题目问题B&#xff1a;社会稳定预警研究 人类和…

【C语言】文件相关函数详解

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;别人可以拷贝我的模式&#xff0c;但不能拷贝我不断往前的激情 &#x1f6f8;C语言专栏&#xff1a;https://blog.csdn.net/vhhhbb/category_12174730.html 小苏希望大家能从这篇文章中收获到许…

C++类基础(四)

访问限定符与友元 ● 使用 public/private/protected 限定类成员的访问权限 //main.cpp struct Str { //结构体默认的访问权限&#xff0c;可以省略 //public:int x 0; private:int y 0; };int main() {Str m_str;//OK: 在同一个翻译单元内&#xff0c;结构体struct Str { .…

单车价值超整车售价?智能汽车「新赛道」扎堆供应商

汽车网络安全赛道正在进入新周期。 1月初&#xff0c;HL Mando与全球汽车网络安全方案提供商Argus Cyber Security达成协议&#xff0c;扩大网络安全技术合作。前者将Argus CAN入侵检测系统&#xff08;IDS&#xff09;解决方案应用于刹车和转向等电气化系统产品。 目前&#x…

希尔排序基本思想示例及代码

希尔排序是插入排序的一种&#xff0c;直接插入排序相关内容可见&#xff1a; https://blog.csdn.net/weixin_43978384/article/details/128836898?spm1001.2014.3001.5502 1、算法思想 希尔排序又称“缩小增量”的排序&#xff0c;属于插入排序的一种。希尔排序的基本思想是…

Springboot+ssm企业员工考勤管理系统

毕业的进度&#xff1a; 第一阶段 系统概要设计&#xff0c;设计系统架构&#xff0c;数据库模型 第二阶段 完成模块的开发与测试 第三阶段 实现主要模块 本公司员工管理系统的设计与实现以Springboot作为框架&#xff0c;B/S模式以及MySql作为后台运行的数据库。…

2023年深圳积分入户考这个软考高级证书错不了!加分真高!

信息系统项目管理师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资…

最完整的文档成像工具包:GdPicture.NET Crack

GdPicture.NET企业级智能 PDF 和文档处理 SDK&#xff0c;使用最先进的人工智能、机器学习和模糊逻辑算法的高度复杂的 API 集。经过超过 15 年专注于创新的持续研究&#xff0c;GdPicture.NET 已成为市场上最全面的PDF、OCR、条形码、文档图像和格式的 SDK 。 最佳文档影像 SD…

设计模式之装饰器模式,以C++为例。

昨天更新了适配器&#xff0c;今天来盘一盘装饰器模式。装饰器模式以一种动态的方式给对象添加额外的职责&#xff0c;好似“装饰”在对象身上一样&#xff0c;通常通过继承和委托来实现。 目录 一、装饰器模式介绍 二、游戏人物如何使用装饰器模式 三、进阶写法&#xff08;…

VScode ssh远程登陆到服务器阅读代码

1、背景介绍在工作中经常使用ssh远程访问服务阅读代码&#xff0c;但是通过ssh远程访问后没有图形界面&#xff0c;阅读代码非常不方便&#xff0c;本文向大家介绍使用VScode通过ssh远程登陆到服务器&#xff0c;本地可视化阅读查看服务器的代码文件。2、安装VS CodeVisual Stu…

Nginx优化

一.设置Nginx运行进程个数 1.查看cpu个数 grep processor /proc/cpuinfo 使用top 按1,也可以查看cpu的核心数 2.设置Nginx进程数 我的cpu数量是4,修改为4 vim /usr/local/nginx/conf/nginx.conf 二.Nginx运行CPU亲和力 vim /usr/local/nginx/conf/nginx.conf 4核4线程配置 注…

叠氮试剂1379690-01-3,3-Azido-D-alanine HCl,3-叠氮-D-丙氨酸HCl

产品规格&#xff1a;3-叠氮-D-丙氨酸HCl&#xff0c;3-Azido-D-alanine HCl1.CAS号&#xff1a;1379690-01-32.分子式&#xff1a;C3H7ClN4O23.分子量&#xff1a;166.566284.包装规格&#xff1a;1g&#xff0c;5g&#xff0c;10g&#xff0c;包装灵活&#xff0c;有100mg包装…

06-Servlet

目录1.Servlet 技术a)什么是 Servletb)手动实现 Servlet 程序&#xff01;这里要自己引入jar包&#xff0c;配置一下tomcat服务器c)url 地址到 Servlet 程序的访问d)Servlet 的生命周期e)GET 和 POST 请求的分发处理f) 通过继承 HttpServlet 实现Servlet 程序g)使用 IDEA 创建S…

小程序项目学习--第八章:播放页功能-代码重构-分包优化-打包发布

第八章:播放页功能-代码重构-分包优化-打包发布 01_(掌握)播放页-歌词分页的上下滚动区域 隐藏滚动条 .lyric-list ::-webkit-scrollbar {display: none; }歌词分页的上下滚动区域动态设置样式 思考什么时候是第一句歌词&#xff0c;什么时候是最后一句歌词 <swiper-ite…

嘉明的云计算与大数据学习之大数据综合实验案例

1.实验环境 (1)Linux:Ubuntu 16.04。 虚拟机镜像下载链接&#xff1a;https://pan.baidu.com/s/1i_B-2rAfPM53jf7Besi0tw 提取码&#xff1a;WZJM (2)MySQL:5.7.16。 (3)Hadoop:2.7.1。 (4)HBase:1.1.5。 (5)Hive:1.2.1。 (6)Sqoop:1.4.6。 (7)R:4.1.2。 (8)Eclipse:3.8。 2.…