当前位置: 首页 > news >正文

STM32-笔记30-编程实现esp8266联网功能

串口2连接ESP8266模块

复制项目文件34-ESP8266串口间的通信

重命名为35-编程实现ESP8266联网功能

打开项目文件

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "esp8266.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();//初始化led灯uart1_init(115200);esp8266_init(115200);// printf("hello word!\r\n");while(1){ //esp8266_receive_data();
//        esp8266_test();
//        delay_ms(10);}
}

esp8266.c

#include "sys.h"
#include "esp8266.h"
#include "string.h"
#include "stdio.h"
#include "delay.h"uint8_t esp8266_rx_buf[ESP8266_RX_BUF_SIZE];//定义一个数组,用来保存接收的数据
uint16_t esp8266_cnt = 0,esp8266_cntPre = 0; //定义一个计数器,和保存计数器原本状态的变量UART_HandleTypeDef esp8266_handle = {0};void esp8266_uart_init(uint32_t baudrate)
{esp8266_handle.Instance = USART2;esp8266_handle.Init.BaudRate = baudrate;  //波特率esp8266_handle.Init.Mode = UART_MODE_TX_RX;//收发模式;esp8266_handle.Init.Parity = UART_PARITY_NONE;//无校验位esp8266_handle.Init.WordLength = UART_WORDLENGTH_8B;  //字长:8个字长esp8266_handle.Init.StopBits = UART_STOPBITS_1; //停止位:1个停止位esp8266_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; //无硬件流控HAL_UART_Init(&esp8266_handle);
}void USART2_IRQHandler(void)
{uint8_t receive_data = 0;//这个函数是用来检查特定的UART接口(在这个例子中是esp8266_handle所代表的UART接口)是否有数据可读if(__HAL_UART_GET_FLAG(&esp8266_handle,UART_FLAG_RXNE) != RESET)//关注RXNE这个标志位的值是不是不为reset(0){if(esp8266_cnt >= sizeof(esp8266_rx_buf))//如果接收的字符长度大于字符缓冲区的长度,则把缓冲区长度置0esp8266_cnt = 0;//如果RXNE的值为1,证明有数据,所以需要接收数据HAL_UART_Receive(&esp8266_handle,&receive_data,1,1000);//句柄,接收的数据存放在哪?接收数据的个数,超时时间esp8266_rx_buf[esp8266_cnt++] = receive_data;//将接收的数据存放在esp8266rx_buf数组中//HAL_UART_Transmit(&esp8266_handle,&receive_data,1,1000);//发送数据:句柄,要发送的数据,发送数据的长度,超时}
}
//这个函数主要用来判断esp8266cnt有没有动,如果没有动证明接收完成了
uint8_t esp8266_wait_receive(void)
{if(esp8266_cnt == 0)//如果cnt为0证明,出现了错误return ESP8266_ERROR;//出现错误if(esp8266_cnt == esp8266_cntPre)//判断当前cnt和上一个cnt是否一致,如果是一致的证明数据不动了,传输完成{esp8266_cnt = 0;//cnt清0return ESP8266_EOK;//数据接收完成}esp8266_cntPre = esp8266_cnt;//把当前计数器cnt的值赋给之前计数器return ESP8266_ERROR;//}
//把接收寄存器的内容清空
void esp8266_rx_clear(void)
{//把接收缓冲器清空memset(esp8266_rx_buf,0,sizeof(esp8266_rx_buf));//清空长度esp8266_cnt = 0;
}
测试函数-这个函数在while循环里,来一直判断当前数据是否接收完
//void esp8266_receive_data(void)
//{
//    if(esp8266_wait_receive() == ESP8266_EOK)//判断数据是否接受完整
//    {
//        printf("esp8266 recv: %s\r\n",esp8266_rx_buf);//接收完整,打印数据
//        esp8266_rx_clear();//清除当前接收
//    }
//}
//定义一个发送指令函数,cmd是发送的指令,res是期待的返回值,对应指令接收的日志
uint8_t esp8266_send_command(char *cmd,char *res)
{uint8_t time_out = 250;esp8266_rx_clear();//把接收缓冲区的内容清空HAL_UART_Transmit(&esp8266_handle,(uint8_t *)cmd,strlen(cmd),100);//发送的库函数:句柄,要发生的内容,内容的长度,阻塞的值//一共等待2.5s的时间,每一次等待10mswhile(time_out--){if(esp8266_wait_receive() == ESP8266_EOK)//表示已经接收到数据{if(strstr((const char*)esp8266_rx_buf,res) != NULL)//判断接收到的数据里面有没有我们想要的数据return ESP8266_EOK;}delay_ms(10);}return ESP8266_ERROR;
}
//AT指令
uint8_t esp8266_at_test(void)
{return esp8266_send_command("AT\r\n","OK");
}
//工作模式:1. 是station(设备)模式 2.是AP(路由)模式 3.是双模
uint8_t esp8266_set_mode(uint8_t mode)
{switch(mode){case ESP8266_STA_MODE:return esp8266_send_command("AT+CWMODE=1\r\n","OK");case ESP8266_AP_MODE:return esp8266_send_command("AT+CWMODE=2\r\n","OK");case ESP8266_STA_AP_MODE:return esp8266_send_command("AT+CWMODE=3\r\n","OK");default:return ESP8266_EINVAL;//数据非法}
}
//以设备模式接入家中路由器,账号和密码
uint8_t esp8266_join_ap(char *ssid,char *pwd)
{char cmd[64];sprintf(cmd,"AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pwd);//使用sprintf构造字符串return esp8266_send_command(cmd,"WIFI GOT IP");
}
//模式:设置单路链接模式(透传只能使用此模式)
uint8_t esp8266_connection_mode(uint8_t mode)
{char cmd[64];sprintf(cmd,"AT+CIPMUX=%d\r\n",mode);//使用sprintf构造字符串return esp8266_send_command(cmd,"OK");
}void esp8266_init(uint32_t baudrate)
{printf("esp8266初始化开始...\r\n");//esp8266串口初始化esp8266_uart_init(baudrate);//esp8266的其他初始化 printf("测试esp8266是否存在...\r\n");while(esp8266_at_test())delay_ms(500);printf("设置工作模式为STA...\r\n");while(esp8266_set_mode(ESP8266_STA_MODE))delay_ms(500);printf("设置单路链接模式...\r\n"); while(esp8266_connection_mode(ESP8266_SINGLE_CONNECTION))delay_ms(500);printf("连接wifi,SSID:%s,PWD:%s...\r\n",WIFI_SSID,WIFI_PWD);while(esp8266_join_ap(WIFI_SSID,WIFI_PWD))delay_ms(1500);printf("esp8266初始化完成\r\n");}//定义一个临时的函数,用来测试,判断发送一个指令回应的函数是否正确
void esp8266_test(void)
{if(esp8266_send_command("AT","OK") == ESP8266_EOK)printf("esp8266 test:%s\r\n",esp8266_rx_buf);
}

esp8266.h

#ifndef __ESP8266_H__
#define __ESP8266_H__#include "sys.h"#define ESP8266_RX_BUF_SIZE         128 //接收的长度
#define ESP8266_TX_BUF_SIZE         64  //发送的长度#define ESP8266_EOK                  0  //宏定义错误代码 ok
#define ESP8266_ERROR                1  //错误
#define ESP8266_ETIMEOUT             2  //超时
#define ESP8266_EINVAL               3  //数据非法#define ESP8266_STA_MODE             1  //STA模式
#define ESP8266_AP_MODE              2  //AP模式
#define ESP8266_STA_AP_MODE          3  //双模#define ESP8266_SINGLE_CONNECTION    0  //单链接
#define ESP8266_MULTI_CONNECTION     1  //多链接#define WIFI_SSID                    "ChinaUnicom-FXL6NZ"  //wifi账号
#define WIFI_PWD                     "13555305181ljf"      //wifi密码void esp8266_init(uint32_t baudrate);
void esp8266_receive_data(void);#endif

http://www.lryc.cn/news/516705.html

相关文章:

  • oscp备考 oscp系列——Kioptix Level 1靶场 古老的 Apache Vuln
  • 《机器学习》——随机森林
  • 指代消解:自然语言处理中的核心任务与技术进展
  • 记录一下Unity webgl cannot read properties of undefined reading apply 错误
  • 【C语言程序设计——选择结构程序设计】求阶跃函数的值(头歌实践教学平台习题)【合集】
  • unity 播放 序列帧图片 动画
  • HTML - <a>
  • Unity学习笔记(六)使用状态机重构角色移动、跳跃、冲刺
  • 【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
  • Android Telephony | 协议测试针对 test SIM attach network 的问题解决(3GPP TS 36523-1-i60)
  • jenkins入门3 --执行一个小demo
  • STM32传感器系列:GPS定位模块
  • 技术成长战略是什么?
  • 【前端】Vue3与Element Plus结合使用的超详细教程:从入门到精通
  • Linux 35.6 + JetPack v5.1.4之 pytorch升级
  • 旷视科技C++面试题及参考答案
  • C 语言函数指针 (Pointers to Functions, Function Pointers)
  • 66.基于SpringBoot + Vue实现的前后端分离-律师事务所案件管理系统(项目 + 论文)
  • Docker容器中Elasticsearch内存不足问题排查与解决方案
  • Ubuntu 下测试 NVME SSD 的读写速度
  • Neo4j的部署和操作
  • react axios 优化示例
  • 探索数字化展馆:开启科技与文化的奇幻之旅
  • 基于深度学习的视觉检测小项目(七) 开始组态界面
  • AI赋能跨境电商:魔珐科技3D数字人破解出海痛点
  • 【C/C++】nlohmann::json从文件读取json,并进行解析打印,实例DEMO
  • 安装Anaconda搭建Python环境,并使用VSCode作为IDE运行Python脚本
  • 我用AI学Android Jetpack Compose之入门篇(1)
  • 使用 Docker 查看 Elasticsearch 错误日志
  • 使用Apache Mahout制作 推荐引擎