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

STM32-笔记32-ESP8266作为服务端

        esp8266作为服务器的时候,这时候网络助手以客户端的模式连接到esp8266,其中IP地址写的是esp8266作为服务器时的IP地址,可以使用AT+CIFSR查询esp8266的ip地址,端口号默认写333。

当esp8266作为服务器的时候,需要完成哪些AT指令的信息

 发现3是没有分装函数的,所以

复制36-编程实现ESP8266连接TCP服务器

重命名为37-编程实现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();delay_ms(10);
//        esp8266_test();
//        delay_ms(500);}
}

esp8266.c

#include "sys.h"
#include "esp8266.h"
#include "string.h"
#include "stdio.h"
#include "delay.h"
#include "stdarg.h"uint8_t esp8266_rx_buf[ESP8266_RX_BUF_SIZE];//定义一个数组,用来保存接收的缓冲区
uint8_t esp8266_tx_buf[ESP8266_TX_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();//清除当前接收}
}
//发送数据的函数
void esp8266_send_data(char *fmt,...)
{va_list ap;uint16_t len;va_start(ap,fmt);vsprintf((char *)esp8266_tx_buf,fmt,ap);va_end(ap);len = strlen((const char *)esp8266_tx_buf);HAL_UART_Transmit(&esp8266_handle,esp8266_tx_buf,len,100);
}
//定义一个发送指令函数,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\"",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");
}
//连接服务器
uint8_t esp8266_connect_tcp_server(char *server_ip,char *server_port)
{char cmd[64];sprintf(cmd,"AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",server_ip,server_port);//使用sprintf构造字符串return esp8266_send_command(cmd,"CONNECT");
}
//透传模式
uint8_t esp8266_enter_unvarnished(void)
{uint8_t ret;ret = esp8266_send_command("AT+CIPMODE=1\r\n","OK"); //如果数据正常传输结果为0ret += esp8266_send_command("AT+CIPSEND\r\n",">");   //如果数据正常传输结果为0if(ret == ESP8266_EOK)return ESP8266_EOK;elsereturn ESP8266_ERROR;
}
//建立TCPserver
uint8_t esp8266_build_tcp_server(void)
{return esp8266_send_command("AT+CIPSERVER=1\r\n","OK");
}
void esp8266_init(uint32_t baudrate)
{printf("esp8266初始化开始...\r\n");//esp8266串口初始化esp8266_uart_init(baudrate);//esp8266的其他初始化 printf("1、测试esp8266是否存在...\r\n");while(esp8266_at_test())delay_ms(500);printf("2、设置工作模式为AP...\r\n");while(esp8266_set_mode(ESP8266_AP_MODE))delay_ms(500);printf("3、设置多路链接模式...\r\n"); while(esp8266_connection_mode(ESP8266_MULTI_CONNECTION))delay_ms(500);printf("4、建立TCP服务器...\r\n");while(esp8266_build_tcp_server())delay_ms(500);printf("esp8266已连接到TCP服务器,并且进入到透传模式\r\n");printf("esp8266初始化完成\r\n");
}//定义一个临时的函数,用来测试,判断发送一个指令回应的函数是否正确
void esp8266_test(void)
{esp8266_send_data("this is from esp8266\r\n");//发送数据esp8266_receive_data();//接收数据
}

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密码#define TCP_SERVER_IP                 "192.168.101.26"  //TCP IP
#define TCP_SERVER_PORT               "8080"            //端口号void esp8266_init(uint32_t baudrate);
void esp8266_receive_data(void);
void esp8266_test(void);#endif

结果实现:

        我们将代码烧录到开发板中,使用usb转ttl连接串口1,与电脑相连接,打印出esp8266的日志信息。使用杜邦线连接esp8266在串口2中。

        网络调试助手连接的信息是esp8266中的,它是作为客户端与服务端的esp8266进行通信的。

        这样当代码烧录到开发板中的时候,给开发板上电,开发板就会通过杜邦线传递AT指令信息给ESP8266,ESP8266收到指令,执行命令,返回指令信息给开发板,开发板收到ESP8266传递的信息,发送到串口2中,串口2连接电脑的串口助手,将信息打印出来。

百度安全验证

出现的问题

当,把所有东西准备就绪之后,出现错误

网络助手连接不上,并且报上面的错误

串口助手停留在这里

可能是:

没有写\r\n

加上就好了,当然如果出现上面网络助手中出现的错误,那么串口助手中起码会把指令完成

在这里,指令都没有完全完成,所有大概率是你代码的事。

相关文章:

STM32-笔记32-ESP8266作为服务端

esp8266作为服务器的时候,这时候网络助手以客户端的模式连接到esp8266,其中IP地址写的是esp8266作为服务器时的IP地址,可以使用ATCIFSR查询esp8266的ip地址,端口号默认写333。 当esp8266作为服务器的时候,需要完成哪些…...

RAG(Retrieval-Augmented Generation,检索增强生成)流程

目录 一、知识文档的准备二、OCR转换三、分词处理四、创建向量数据库五、初始化语言聊天模型1.prompt2.检索链3.对话 完整代码 知识文档的准备:首先需要准备知识文档,这些文档可以是多种格式,如Word、TXT、PDF等。使用文档加载器或多模态模型…...

【Python学习(六)——While、for、循环控制、指数爆炸】

Python学习(六)——While、for、循环控制、指数爆炸 本文介绍了While、for、循环控制、指数爆炸,仅作为本人学习时记录,感兴趣的初学者可以一起看看,欢迎评论区讨论,一起加油鸭~~~ 心中默念:Py…...

解释一下:运放的输入失调电流

输入失调电流 首先看基础部分:这就是同相比例放大器 按照理论计算,输入VIN=0时,输出VOUT应为0,对吧 仿真与理论差距较大,有200多毫伏的偏差,这就是输入偏置电流IBIAS引起的,接着看它的定义 同向和反向输入电流的平均值,也就是Ib1、Ib2求平均,即(Ib1+Ib2)/2 按照下面…...

力扣hot100——二分查找

35. 搜索插入位置 class Solution { public:int searchInsert(vector<int>& a, int x) {if (a[0] > x) return 0;int l 0, r a.size() - 1;while (l < r) {int mid (l r 1) / 2;if (a[mid] < x) l mid;else r mid - 1;}if (a[l] x) return l;else …...

PHP 使用集合 处理复杂数据 提升开发效率

在 PHP 中&#xff0c;集合&#xff08;Collections&#xff09;通常是通过数组或专门的集合类来实现的。 集合&#xff08;Collection&#xff09;是一种高级的数据结构&#xff0c;可以提供比普通数组更强大的操作和功能&#xff0c;特别是当你需要更复杂的数据处理时。 La…...

Unity 对Sprite或者UI使用模板测试扣洞

新建两个材质球&#xff1a; 选择如下材质 设置如下参数&#xff1a; 扣洞图片或者扣洞UI的材质球 Sprite或者UI的材质球 新建一个单独Hole的canvas&#xff0c;将SortOrder设置为0&#xff0c;并将原UI的canvans的SortOrder设置为1 对2DSprite则需要调整下方的参数 hole的O…...

unity学习3:如何从github下载开源的unity项目

目录 1 网上别人提供的一些github的unity项目 2 如何下载github上的开源项目呢&#xff1f; 2.1.0 下载工具 2.1.1 下载方法1 2.1.2 下载方法2&#xff08;适合内部项目&#xff09; 2.1.3 第1个项目 和第4项目 的比较 第1个项目 第2个项目 第3个项目 2.1.4 下载方法…...

PHP后执行php.exe -v命令报错并给出解决方案

文章目录 一、执行php.exe -v命令报错解决方案 一、执行php.exe -v命令报错 -PHP Warning: ‘C:\windows\SYSTEM32\VCRUNTIME140.dll’ 14.38 is not compatible with this PHP build linked with 14.41 in Unknown on line 0 解决方案 当使用PHP8.4.1时遇到VCRUNTIME140.dll…...

CDP集群安全指南-动态数据加密

[〇]关于本文 集群的动态数据加密主要指的是加密通过网络协议传输的数据&#xff0c;防止数据在传输的过程中被窃取。由于大数据涉及的主机及服务众多。你需要更具集群的实际环境来评估需要为哪些环节实施动态加密。 这里介绍一种通过Cloudera Manager 的Auto-TLS功能来为整个…...

【shell编程】报错信息:Undefined Variable(包含6种解决方法)

大家好&#xff0c;我是摇光~ 当Shell脚本报错“Undefined Variable”时&#xff0c;是未定义变量的意思。 以下是对每个可能原因及其对应详细解决方案的详细解释&#xff1a; 原因1&#xff1a;拼写错误 原因&#xff1a; 脚本中变量名的拼写在使用和定义时不一致。例如&…...

Dubbo扩展点加载机制

加载机制中已经存在的一些关键注解&#xff0c;如SPI、©Adaptive> ©Activateo然后介绍整个加载机制中最核心的ExtensionLoader的工作流程及实现原理。最后介绍扩展中使用的类动态编译的实 现原理。 Java SPI Java 5 中的服务提供商https://docs.oracle.com/jav…...

unity学习7:unity的3D项目的基本操作: 坐标系

目录 学习参考 1 unity的坐标系 1.1 左手坐标系 1.2 左手坐标系和右手坐标系的区别 1.3 坐标系的原点(0,0,0) 2 坐标系下的具体xyz坐标 2.1 position这里的具体xyz坐标值 2.2 父坐标 2.3 世界坐标和相对坐标 2.3.1 世界坐标 2.3.2 相对坐标 2.4 父物体&#xff0c;…...

PyTorch框架——基于深度学习EfficientDeRain神经网络AI去雨滴图像增强系统

第一步&#xff1a;EfficientDeRain介绍 EfficientDeRain 是一个针对单张图像去雨的开源项目&#xff0c;该项目由清华大学的研究团队提出&#xff0c;主要用于处理图像中的雨水干扰&#xff0c;恢复图像的真实场景 核心功能 图像去雨&#xff1a;EfficientDeRain 通过学习像素…...

写一个类模板三个模板参数K,V,M,参数是函数(函数参数、lambda传参、函数指针)

cal是类的成员函数。cal的3个入参是func1(K&#xff09;&#xff0c;func2&#xff08;K&#xff0c;V&#xff09;&#xff0c;func3(K&#xff0c;V&#xff0c;M)&#xff0c;请写出cal&#xff0c;并在main函数中调用cal 在您给出的要求中&#xff0c;cal成员函数并不直接…...

国内Ubuntu环境Docker部署Stable Diffusion入坑记录

国内Ubuntu环境Docker部署Stable Diffusion入坑记录 本文旨在记录使用dockerpython进行部署 stable-diffusion-webui 项目时遇到的一些问题&#xff0c;以及解决方案&#xff0c;原项目地址: https://github.com/AUTOMATIC1111/stable-diffusion-webui 问题一览&#xff1a; …...

现代光学基础6

总结自老师的ppt yt6 半导体激光器开卷考试学习资料 目录 半导体激光器边发射半导体激光器垂直腔面发射激光器&#xff08;VCSEL&#xff09;激光产生条件&#xff08;激光原理&#xff09;半导体激光器的水容器模型有源半导体区域类型和载流子注入发光二极管&#xff08;L…...

解决HBuilderX报错:未安装内置终端插件,是否下载?或使用外部命令行打开。

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 错误描述 在HBuilderX中执行npm run build总是提醒下载插件&#xff1b;图示如下&#xff1a; 但是&#xff0c;下载总是失败。运行项目时候依然弹出上述提醒。 解决方案 …...

基于Java的超级玛丽游戏的设计与实现【源码+文档+部署讲解】

目 录 1、绪论 1.1背景以及现状 1.2 Java语言的特点 1.3 系统运行环境及开发软件&#xff1a; 1.4 可行性的分析 1.4.1 技术可行性 1.4.2 经济可行性 1.4.3 操作可行性 2、 需求分析 2.1 用户需求分析 2.2功能需求分析 2.3界面设计需求分析…...

Spring Boot项目中使用单一动态SQL方法可能带来的问题

1. 查询计划缓存的影响 深入分析 数据库系统通常会对常量SQL语句进行编译并缓存其执行计划以提高性能。对于动态生成的SQL语句&#xff0c;由于每次构建的SQL字符串可能不同&#xff0c;这会导致查询计划无法被有效利用&#xff0c;从而需要重新解析、优化和编译&#xff0c;…...

conan从sourceforge.net下载软件失败

从sourceforge.net下载软件&#xff0c;经常会没有开始下载就返回了。 原因是&#xff1a; 自动选择的镜像站不能打开。 在浏览器中&#xff0c;我们可以手动选择站点尝试&#xff0c;但是conan就不行了。 手动选择一个站点&#xff0c;能够有文件保存窗口弹出&#xff0c;之后…...

通过爬虫方式实现视频号助手发布视频

1、将真实的cookie贴到解压后目录中cookie.txt文件里,修改python代码里的user_agent和video_path, cover_path等变量的值,最后运行python脚本即可; 2、运行之前根据import提示安装一些常见依赖,比如requests等; 3、2025年1月份最新版; 代码如下: import json import…...

springboot525基于MVC框架自习室管理和预约系统设计与实现(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装自习室管理和预约系统软件来发挥其高效地信息处理的作用&am…...

“大数据+职业本科”:VR虚拟仿真实训室的发展前景

在新时代背景下&#xff0c;随着科技的飞速进步和产业结构的不断升级&#xff0c;职业教育正迎来前所未有的变革。“大数据职业本科”的新型教育模式&#xff0c;结合VR&#xff08;虚拟现实&#xff09;技术的广泛应用&#xff0c;为实训教学开辟了崭新的道路&#xff0c;尤其…...

Python 数据可视化的完整指南

目录 一、为什么选择 Python 进行数据可视化? 二、常用 Python 可视化库及其特点 三、常用图表类型及其代码示例 折线图:用于展示数据随时间或其他连续变量的变化趋势。 柱状图:用于比较不同类别的数据大小。 散点图:用于展示两个变量之间的关系,并发现数据中的模式…...

滑动窗口。

1456 定长子串中元音的最大数目 采用滑动窗口。每次移动一个位置&#xff0c;判断当前窗口内的子串内目标元素的个数&#xff0c;若比之前更大就更新结果。 如何判断是否更新结果&#xff1f;也即&#xff0c;如何判断当前窗口内所含目标元素个数&#xff0c;是否为遍历到这个…...

【Python运维】用Python和Ansible实现高效的自动化服务器配置管理

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着云计算和大规模数据中心的兴起,自动化配置管理已经成为现代IT运维中不可或缺的一部分。通过自动化,企业可以大幅提高效率,降低人为错…...

Chapter4.2:Normalizing activations with layer normalization

文章目录 4 Implementing a GPT model from Scratch To Generate Text4.2 Normalizing activations with layer normalization 4 Implementing a GPT model from Scratch To Generate Text 4.2 Normalizing activations with layer normalization 通过层归一化&#xff08;La…...

EA工具学习使用笔记 ———— 插入图片或UI

文章目录 介绍导入使用方法一方法二方法3介绍 在使用EA的过程中,我们可以EA的图像管理器自定义图像,从而创建有吸引力的图表。也可以通过图像管理器快速扩展可用图像的范围。方法是导入一个捆绑的基于uml的图像剪辑艺术集合作为图像库文件。EA的图像库下载链接为: 导入 Doc…...

[2474].第04节:Activiti官方画流程图方式

我的后端学习大纲 Activiti大纲 1.安装位置&#xff1a; 2.启动&#xff1a;...