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.hqwc.cn/news/488002.html

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

相关文章

音视频剪辑|Windows|抽帧和合帧

什么是抽帧&#xff1f; FFmpeg 抽帧&#xff08;Extracting frames&#xff09;的作用是从视频文件中按需提取单张或多张静止图像&#xff08;帧&#xff09;&#xff0c;并将它们保存为图片文件&#xff08;如 JPEG、PNG 等格式&#xff09;。这一功能在以下场合十分有用&am…

Qt中的网络编程(Tcp和Udp)运用详解以及简单示范案例

概述 Tcp和Udp是我们学习网络编程中经常接触到的两个通讯协议&#xff0c;在Qt也被Qt封装成了自己的库供我们调用&#xff0c;对于需要进行网络交互的项目中无疑是很重要的&#xff0c;希望这篇文章可以帮助到大家。 考虑到可能有点小伙伴可能不知道Tcp和Udp的一些概念&#x…

Django学习笔记-HTML实现服务器图片的下载

1.index编写代码,跳转下载页面 2.创建download界面 3.编写download路由 4.创建download函数 1).如果请求的方法是GET&#xff0c;imglist变量存储从models.imgModel模型中获取的所有对象,创建字典ctx,使用render函数来渲染download.htm 2).如果请求的方法是POST,获取要下载的文…

Java 基于微信小程序的农产品自主供销小程序

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

123 Linux C++ 系统编程2 Linux 上安装卸载程序三种方法,linux 下解压缩命令 tar介绍。kill命令,top命令,umask 命令

一 通过命令和网络直接安装 sudo apt-get update sudo apt-get update 的工作就是将自己本地 ubutun的软件列表和 aliyun 的软件列表对比&#xff0c;如不一样&#xff0c;则更新。 sudo apt-get install 软件名 真正的安装 那么这里就有一个问题了&#xff0c; 怎么从aliy…

C/C++内存管理学习【new】

文章目录 一、C/C内存分布二、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free三、C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型四、operator new与operator delete函数五、new和delete的实现原理5.1 内置类型 六、定位new表达式(pl…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的无人机目标检测系统(Python+PySide6界面+训练代码)

摘要&#xff1a;本文详细介绍了一种利用深度学习技术的无人机目标检测系统&#xff0c;该系统基于前沿的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等先前版本进行了性能对比。本系统能够在不同媒介如单一图像、视频文件、实时视频流及批量处理文件中准确地检测和识别…

Redis信创平替之TongRDS(东方通),麒麟系统安装步骤

我的系统: 银河麒麟桌面系统V10(SP1)兆芯版 1.先进入东方通申请使用 2.客服会发送一个TongRDS包与center.lic给你(我这里只拿到.tar.gz文件,没有网上的什么安装版) 3.上传全部文件到目录中 4.服务节点安装,并启动 tar -zxvf TongRDS-2.2.1.2_P3.Node.tar.gz cd pmemdb/bin/…

仗剑天涯路 侠气传千古《有翡》湖北热血开播

由吴锦源执导&#xff0c;赵丽颖、王一博领衔主演&#xff0c;张慧雯、陈若轩、孙坚、周洁琼、张昕宇、冷纪元主演的古装武侠剧《有翡》&#xff0c;将于2月25日晚19:30登陆湖北卫视长江剧场。该剧改编自Priest小说《有匪》&#xff0c;讲述了南北朝年间&#xff0c;各方势力盘…

osg qt5.15 osg3.6.3 osgEarth3.1 编译爬山

Demo演示&#xff1a;Qt5.15.2OSG3.6.3OsgEarth3.1的QtCreator下的msvc2019x64版本 osgQt编译 步骤一&#xff1a;下载解压 步骤二&#xff1a;CMake配置 步骤三&#xff1a;CMake配置添加osg环境 步骤四&#xff1a;CMake配置添加Qt环境 步骤五&#xff1a;CMake修改CMakeLis…

v-rep插件

v-rep官网插件汉化教程 官网教程 插件是什么 插件本质上就是遵循一定规范的API编写出来的程序&#xff0c;在v-rep中最终需要编译为动态库。 linux下是libsimXXXX.so&#xff1b; 其中XXXX是插件的名称。 请至少使用4个字符&#xff0c;并且不要使用下划线&#xff0c;因为…

Vue学习之计算属性

模板中的表达式虽然方便&#xff0c;但也只能用来做简单的操作。如果在模板中写太多逻辑&#xff0c;会让模板变得臃肿&#xff0c;难以维护。比如说&#xff0c;我们有这样一个包含嵌套数组的对象&#xff1a; const author reactive({name: John Doe,books: [Vue 2 - Advan…