STM32物联网(封装AT指令进行TCP连接及数据的接收和发送)

文章目录

  • 前言
  • 一、AT指令函数封装
    • 1.向ESP8266发送数据函数
    • 2.设置ESP8266工作模式
    • 3.连接WIFI函数
    • 4.查询IP地址
    • 5.连接TCP服务器
    • 6.发送数据到TCP服务器
    • 7.接收并解析来自TCP服务器的数据
    • 8.关闭TCP服务器
  • 二、代码测试
  • 总结


前言

本篇文章将继续带大家学习STM32物联网,那么在这篇文章中将会封装对应AT指令操作的函数来进行WIFI连接以及TCP的连接。

一、AT指令函数封装

1.向ESP8266发送数据函数

我们需要封装一个函数来给ESP8266发送AT指令。

ESP8266连接到了开发板的串口3,实验直接使用HAL_UART_Transmit来向串口3发送数据即可。

//发送命令给ESP8266
void ESP8266_SendCommand(const char* command)
{HAL_UART_Transmit(&huart3, (uint8_t *)command, strlen(command), 10000);
}

2.设置ESP8266工作模式

设置wifi模式的指令:
在这里插入图片描述

直接使用封装好的函数进行连接即可。

ESP8266_SendCommand("AT+CWMODE=3\r\n");

3.连接WIFI函数

连接wifi函数如下:
在这里插入图片描述

//连接wifi
void ESP8266_ConnectWiFi(const char* ssid, const char* pass) 
{char cmd[100];// 发送命令:AT+CWJAP="YourWiFiSSID","YourWiFiPassword"sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, pass);ESP8266_SendCommand(cmd);  
}

函数的输入是 Wi-Fi 网络的 SSID 和密码。这些参数是指向 char 数组的指针。ssid 是要连接的 Wi-Fi 网络的 SSID (Service Set Identifier),而 pass 则是该 Wi-Fi 网络的密码。

首先,该函数声明了一个长度为100的字符数组 cmd 用于存储最终发送到 ESP8266 模块的 AT 命令。

使用 sprintf 函数将 Wi-Fi SSID 和密码拼接到一个格式化的字符串中,这个字符串是一个包含了 Wi-Fi SSID 和密码的 AT 命令,格式为 “AT+CWJAP=“SSID”,“PASSWORD”\r\n”,其中 “SSID” 和 “PASSWORD” 部分会被传入的 ssid 和 pass 替换。

最后,将格式化后的 AT 命令通过 ESP8266_SendCommand 函数发送给 ESP8266 模块,使其连接到指定的 Wi-Fi 网络。

4.查询IP地址

查询IP地址指令如下:

在这里插入图片描述

ESP8266_SendCommand("AT+CIFSR\r\n");//查询AP地址

5.连接TCP服务器

下面是连接TCP连接的代码:
在这里插入图片描述

//连接TCP服务器
void ESP8266_ConnectTCPServer(const char* ServerIP, int ServerPort)
{// 定义一个缓冲区用于存储命令字符串char cmd[100];// 发送连接到TCP服务器的命令// 例如:AT+CIPSTART="TCP","192.168.1.100",80sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", ServerIP, ServerPort);ESP8266_SendCommand(cmd);	
}

函数的输入参数是 ServerIP 和 ServerPort。ServerIP 是要连接的服务器的 IP 地址,以字符串形式传入。ServerPort 是服务器的端口号,以整数形式传入。

首先,函数声明了一个长度为 100 的字符数组 cmd,用于存储最终发送到 ESP8266 模块的 AT 命令。

使用 sprintf 函数将服务器的 IP 地址和端口号拼接到一个格式化的字符串中,形成一个 AT 命令,格式为 “AT+CIPSTART=“TCP”,“ServerIP”,ServerPort\r\n”,其中 “ServerIP” 和 ServerPort 部分会被传入的 ServerIP 和 ServerPort 替换。

最后,将格式化后的 AT 命令通过 ESP8266_SendCommand 函数发送给 ESP8266 模块,以连接到指定的 TCP 服务器。

6.发送数据到TCP服务器

下面是发送数据到TCP服务器的函数:
在这里插入图片描述

//发送数据到TCP服务器
void ESP8266_SendToTCPServer(const char* txData)
{// 发送命令:AT+CIPSEND=<length>char cmd[100];sprintf(cmd, "AT+CIPSEND=%d\r\n", strlen(txData));ESP8266_SendCommand(cmd);HAL_Delay(100);// 发送数据ESP8266_SendCommand(txData);	
}

7.接收并解析来自TCP服务器的数据

uint8_t esp8266_rxbuf[RECVBUFSIZE] = {0};//用于保存ESP8266发来的数据//空闲中断回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{if(huart->Instance == USART3){		printf("%s", esp8266_rxbuf);ESP8266_PraseToTCPServer((const char*)esp8266_rxbuf);memset(esp8266_rxbuf, 0, sizeof(esp8266_rxbuf));//清空接收到的数据HAL_UARTEx_ReceiveToIdle_DMA(&huart3, esp8266_rxbuf, RECVBUFSIZE);}
}//解析ESP8266接收到的TCP数据
void ESP8266_PraseToTCPServer(const char* rxdata)
{//检查数据中是否含有IPDchar *ipdPtr = strstr(rxdata, "IPD");if (ipdPtr != NULL){// 找到消息内容的起始位置char *ptr = strstr(rxdata, ":");if (ptr != NULL) {char* message = ptr + 1;printf("\r\n.....................\r\n");printf("recvmsg : %s\r\n", message);printf(".....................");}}			
}

uint8_t esp8266_rxbuf[RECVBUFSIZE] = {0};: 定义了一个长度为 RECVBUFSIZE 的缓冲区 esp8266_rxbuf,用于保存 ESP8266 模块接收到的数据。

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size): 这是一个空闲中断回调函数。当 UART 接收到足够数量的数据后,会触发空闲中断,进入这个回调函数。在这个回调函数中,首先检查 huart->Instance 是否为 USART3,以确保是与 ESP8266 通信的 UART。然后,通过 printf(“%s”, esp8266_rxbuf); 打印接收到的数据,接着调用 ESP8266_PraseToTCPServer 函数对接收到的数据进行解析,最后通过 memset 清空接收缓冲区,准备接收下一次的数据。

void ESP8266_PraseToTCPServer(const char* rxdata): 这个函数用于解析从 TCP 服务器接收到的数据。首先,通过 strstr 函数检查数据中是否包含 “IPD”,表示接收到了一个 TCP 数据包。如果找到了 “IPD”,则继续寻找 “:”,找到消息内容的起始位置。接着,通过 printf 打印接收到的消息内容。

8.关闭TCP服务器

下面是关闭TCP服务器的AT指令:
在这里插入图片描述

//关闭TCP服务
void ESP8266_CLOSETCP(void)
{ESP8266_SendCommand("AT+CIPCLOSE\r\n");
}

二、代码测试

先使用手机开一个热点,这个热点要是2.4GHZ的频段。

让STM32 通过ESP8266连接到手机热点,让电脑也连接到手机热点,让他们处于同一个局域网下。然后就可以让STM32作为客户端和电脑建立TCP连接进行数据之间的通信。
在这里插入图片描述
开启TCP服务器:

在这里插入图片描述
将代码烧录到ESP8266中:
在这里插入图片描述

测试结果表明可以进行正常的数据收发。
在这里插入图片描述

总结

本篇文章就讲解到这里,下篇文章将带大家继续学习。

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

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

相关文章

Vue 2.0 中的 Vuex Store 状态管理器核心概念和组成部分

Vue 2.0 中的 Vuex Store 状态管理器核心概念和组成部分 State&#xff08;状态&#xff09;&#xff1a; Vuex Store 的核心就是集中式存储应用的所有组件的状态。它是一个单一状态树&#xff0c;所有的组件都从这个状态树中读取数据并可以响应状态的变化。 const state {c…

Ubuntu20.04 查看系统版本号

目录 uname -auname -vlsb_release -acat /etc/issuecat /proc/version uname -a 查看系统发行版本号和操作系统版本 uname -v 查看版本号 lsb_release -a 查看发行版本信息 cat /etc/issue 查看系统版本 cat /proc/version 查看内核的版本号

计算机网络面经_体系结构一文说清

编辑&#xff1a;平平无奇的羊 目录 基础 1. 计算机网络结构体系 三种模型之间的区别&#xff1a; 如何背诵&#xff1a; 进阶 OSI七层模型&#xff1a; TCP/IP四层模型&#xff1a; TCP/IP五层模型 总结 字节实习生为大家带来的是计算机网络面经系列博文&#xff0c;由浅…

分散的产品开发团队

分散的产品开发团队指的是各个团队或成员在地理位置上分布在不同地方&#xff0c;通过互联网和现代通讯技术进行协作和沟通&#xff0c;以共同完成产品开发任务的团队模式。 这种团队模式的优势在于可以充分利用各地的人才资源&#xff0c;降低团队的管理和协作成本&#xff0…

SpringBoot和SpringCloud的区别,使用微服务的好处和缺点

SpringBoot是一个用于快速开发单个Spring应用程序的框架&#xff0c;通过提供默认配置和约定大于配置的方式&#xff0c;快速搭建基于Spring的应用。让程序员更专注于业务逻辑的编写&#xff0c;不需要过多关注配置细节。可以看成是一种快速搭建房子的工具包&#xff0c;不用从…

ThreeJS 几何体顶点position、法向量normal及uv坐标 | UV映射 - 法向量 - 包围盒

文章目录 几何体的顶点position、法向量normal及uv坐标UV映射UV坐标系UV坐标与顶点坐标设置UV坐标案例1&#xff1a;使用PlaneGeometry创建平面缓存几何体案例2&#xff1a;使用BufferGeometry创建平面缓存几何体 法向量 - 顶点法向量光照计算案例1&#xff1a;不设置顶点法向量…

P18 位运算

位运算是一种对二进制的位进行操作的运算方式 它直接对二进制数的每一位进行逻辑操作&#xff0c;而不考虑整个数的数组。 &与运算 |或运算 ^异运算 [相同位0 不同为1] ~取反 <<按位左移动低位补0&#xff0c;如果数据类型有符号整 5<<3 5*(2^3) >&g…

【行人检测数据集】

数据集&#xff1a; INRIA Person DataBase http://pascal.inrialpes.fr/data/human/ ftp://ftp.inrialpes.fr/pub/lear/douze/data/INRIAPerson.tar Caltech Pedestrian Detection Benchmark http://www.vision.caltech.edu/Image_Datasets/CaltechPedestrians/ https://zh…

探讨javascript中运算符优先级

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 深入理解JavaScript运算符优先级运算符优先级概述示例演示示例1&#xff1a;加法和乘法运算符的优先级示…

CentOS7 安装Python3.8

在 CentOS 7 上&#xff0c;按照以下步骤安装 Python 3.8&#xff1a; 添加EPEL仓库&#xff1a;首先安装 EPEL&#xff08;Extra Packages for Enterprise Linux&#xff09;仓库 sudo yum install epel-release安装Software Collections (SCL)仓库&#xff1a;随后&#xff0…

【坑】Spring Boot整合MyBatis,一级缓存失效

一、Spring Boot整合MyBatis&#xff0c;一级缓存失效 1.1、概述 MyBatis一级缓存的作用域是同一个SqlSession&#xff0c;在同一个SqlSession中执行两次相同的查询&#xff0c;第一次执行完毕后&#xff0c;Mybatis会将查询到的数据缓存起来&#xff08;缓存到内存中&#xf…

证件照(兼容H5,APP,小程序)

证件照由uniappuyui开发完成&#xff0c;并同时兼容H5、App、微信小程序、支付宝小程序&#xff0c;其他端暂未测试。 先看部分效果图吧具体可以下方复制链接体验demo 首页代码 <template><view class""><view class"uy-m-x-30 uy-m-b-20"…

adb push 使用

adb push命令用于将文件从本地计算机推送到Android设备。要使用adb push命令&#xff0c;需要先连接Android设备并启动ADB调试模式。以下是使用adb push命令的基本步骤&#xff1a; 打开终端&#xff08;命令提示符&#xff09;。 使用cd命令导航到存储要推送文件的文件夹。 …

R语言【ClusterR】——KMeans_rcpp()

Package ClusterR version 1.3.2 Description 使用RcppArmadillo计算k-means。 Usage KMeans_rcpp(data,clusters,num_init = 1,max_iters = 100,initializer = "kmeans++",fuzzy = FALSE,verbose = FALSE,CENTROIDS = NULL,tol = 1e-04,tol_optimal_init = 0.3,se…

Redis 事务机制之ACID属性

事务属性 事务是对数据库进行读写的一系列操作。在事务执行时提供ACID属性保证&#xff1a; 包括原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#xff09;…

如何申请代码签名证书?

代码签名证书是一种关键的数字证书&#xff0c;它的功能在于为软件代码提供安全签名和验证服务&#xff0c;从而提升软件整体的安全性和用户信任度。获取代码签名证书的过程通常涉及多个严谨步骤&#xff0c;确保通过正式流程获得的证书能有效加强软件完整性和真实性保护。以下…

Innodb底层原理与Mysql日志机制深入剖析

MySQL的内部组件结构 大体来说&#xff0c;MySQL 可以分为 Server 层和存储引擎层两部分。 Server层 主要包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函…

力扣hot100题解(python版10-12题)

哎- -最近本来就没时间写算法 这算法怎么还这么难。。。 10、和为 K 的子数组 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1]…

uniappQQ登录是如何实现的,请说明其流程

QQ登录功能的实现分成以下几个步骤&#xff1a; 注册QQ互联账号并创建应用&#xff0c;获取 appid 配置回调地址 recirect_uri在页面中放置 QQ登录按钮&#xff0c;点击按钮后跳转到 QQ 登录页面&#xff0c;链接地址是由 QQ 平台提供的&#xff0c;需要拼接上申请的 appid登录…

华为配置WDS手拉手业务示例

配置WDS手拉手业务示例 组网图形 图1 配置WDS手拉手业务示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 企业用户通过WLAN接入网络&#xff0c;以满足移动办公的最基本需求。但企业考虑到AP通过有线部署的成本较高&#xff0c;所以通过建立…