【STM32 物联网】AT指令与TCP,发送与接收数据

文章目录

  • 前言
  • 一、连接TCP服务器
    • 1.1 配置Wifi模式
    • 1.2 连接路由器
    • 1.3 查询ESP8266设备IP地址
    • 1.4 连接TCP服务器
  • 二、向服务器接收数据和发送数据
    • 2.1 发送数据
    • 2.2 接收数据
  • 总结


前言

随着物联网(IoT)技术的迅速发展,越来越多的设备和系统开始连接到互联网,实现远程监控、数据采集和远程控制等功能。在物联网应用中,STM32微控制器以其强大的性能和丰富的外设功能成为了重要的选择之一。而在STM32与互联网通信中,AT指令与TCP/IP协议成为了两个重要的技术手段。


一、连接TCP服务器

1.1 配置Wifi模式

我们可以使用下面这个AT指令进行WIFI模式的设置:AT+CWMODE=3 // softAP+station mode。3的意思为softAP+station一起,即可以开热点也可以连接路由器,一般我们都是使用这个

1.2 连接路由器

我们可以使用下面这个AT指令连接我们的路由器或者热点:AT+CWJAP="SSID","password"我们的名称和密码都需要双引号,所以我们发送cmd时,字符串里面的名称和密码需要转义字符的帮助

1.3 查询ESP8266设备IP地址

我们可以使用下面这个AT指令来查询ESP8266的设置IP地址:AT+CIFSR
在这里插入图片描述

1.4 连接TCP服务器

我们可以使用下面这个AT指令来连接我们的TCP服务器:
AT+CIPSTART="TCP","TCPServerIP",8080,注意,前两个参数是需要加双引号的,后面的端口8080不需要

二、向服务器接收数据和发送数据

2.1 发送数据

首先我们需要发送AT指令告诉ESP8266说我等下要发数据了
AT+CIPSEND=你要发送的字节大小 // set date length which will be sent
然后我们等待一会:我们直接发送我们的需要发送的数据即可,这个可以不需要使用\r\n作为最后,如果你想换行也是可以使用的

2.2 接收数据

对于我们的接收数据,当我们服务端发送数据之后,esp8266会马上发给我们stm32的串口,然后我们的串口就会进入回调函数打印接收到的数据,但是这样我们就不能知道他什么时候发给我们数据了,那发送还有什么意义呢,所以我们需要自己实现函数,对esp8266的数据进行实时解析成tcp服务器发送的数据。

每次TCP服务端发送给ESP8266,ESP8266会这样显示出数据:+IPC,数据个数:数据
我们可以根据前面的+IPC来判断,这次的数据不是我们发送AT指令返回的数据,而是我们的服务端给我们发送的数据
所以我们可以写一个函数进行解析:

int checkADDIPD(void)
{int ret = 0;char temp[5] = {"+IPD"};int index = 0;for(int i = 0;i<strlen((char*)esp8266_rxbuf);i++){if(esp8266_rxbuf[i] == temp[index]){ret++;index++;if(ret == 4){break;}}}return ret == 4;
}

在我们的回调函数中就可以每次去check一下数据了。

由于这是串口接收,每次buf并不会被清空,这样会影响我们的判断,再每次执行完回调之后,我们应该清空buf,但是由于回调函数清空了的话,我们实际需要的也会被清空啊(因为回调函数高于任何普通的函数,所以我们无法及时拿到数据,导致数据的丢失),所以需要变量先记录buf,然后再清空buf。

uint8_t esp8266_rxbuf[1000] = {0};
uint8_t recvfrom[1000] = {0};memcpy(recvfrom,esp8266_rxbuf,sizeof(esp8266_rxbuf));
memset(esp8266_rxbuf,0,sizeof(esp8266_rxbuf));

从我们的网络知识知道,recv他是一个阻塞的函数,所以我们也需要实现阻塞,我们只需要加一个变量即可,当没数据时,while循环,有数据时,读取到具体的数据,然后进行下面的其他代码。
那么何时有数据呢?当我们的回调函数执行checkADDIPD为1时,为有数据发过来了。所以在判断if checkADDIPD 时,把变量标记一下即可

if(checkADDIPD() == 1) RxData=1;//read函数
while(RxData == 0)
{HAL_Delay(10);
}

不要忘记在while循环结束后标记变量为0

过了while循环,我们应该去解析+IPC,数据个数:数据他了。在这里,我并没有去进一步解析他的数据个数,这里仅仅是一个简单的演示。我们可以写一个函数去解析他,并且把解析之后的内容通过返回值返回给我们。

// 函数定义
char* parseStringAfterColon(const char* input) {// 查找冒号的位置const char* colonPtr = strchr(input, ':');// 如果找到了冒号if (colonPtr != NULL) {// 返回冒号后面的字符串(不包括冒号本身)size_t length = strlen(colonPtr + 1);char* result = (char*)malloc(length + 1); // 分配足够的内存来存储结果if (result != NULL) {strcpy(result, colonPtr + 1); // 复制字符串return result;} else {printf("内存分配失败\n");return NULL;}} else {printf("未找到冒号\n");return NULL;}
}

然后我们把我们存储到的数据recvData作为参数给这个函数:

char *data = parseStringAfterColon(recvfrom);

这个data就是我们解析出来服务端发给我们的数据了。
最后,我们不要忘记释放data


总结

AT指令是一种简单的命令集,常用于与通信设备进行串口通信。在STM32物联网应用中,通过串口与无线模块(如SIM800、SIM900等)通信时,常常使用AT指令来控制模块实现TCP/IP连接、数据传输等功能。AT指令的简洁易用使得STM32与无线模块之间的通信变得更加简单可靠。

与此同时,TCP/IP协议作为互联网通信的基础协议,也在STM32物联网应用中发挥着重要作用。通过TCP/IP协议,STM32可以与远程服务器建立稳定的连接,实现数据的可靠传输。TCP/IP协议提供了可靠的数据传输机制,保证了数据的完整性和可靠性,使得STM32在物联网应用中能够更好地与互联网进行通信。

综上所述,AT指令与TCP/IP协议在STM32物联网应用中发挥着重要的作用。通过使用AT指令控制无线模块,以及通过TCP/IP协议与远程服务器通信,STM32可以实现丰富的物联网功能,为各种物联网应用提供了强大的支持和保障。

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

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

相关文章

政安晨:【完全零基础】认知人工智能(二)【超级简单】的【机器学习神经网络】—— 底层算法

如果小伙伴第一次看到这篇文章&#xff0c;可以先浏览一下我这个系列的上一篇文章&#xff1a; 政安晨&#xff1a;【完全零基础】认知人工智能&#xff08;一&#xff09;【超级简单】的【机器学习神经网络】 —— 预测机https://blog.csdn.net/snowdenkeke/article/details/…

阿里云服务器CPU内存配置怎么选择够用?

阿里云服务器配置怎么选择&#xff1f;根据实际使用场景选择&#xff0c;个人搭建网站可选2核2G配置&#xff0c;访问量大的话可以选择2核4G配置&#xff0c;企业部署Java、Python等开发环境可以选择2核8G配置&#xff0c;企业数据库、Web应用或APP可以选择4核8G配置或4核16G配…

技能下载中:Sora视频让机器人秒学任何技艺!

引言 在机器人成为平凡工匠和前沿先驱的时代&#xff0c;我们正站在新黎明的边缘。本文将探讨斯坦福大学的通用操作接口&#xff08;UMI&#xff09;及其与OpenAI的Sora如何共同推进机器人技术&#xff0c;开创未来学习的新纪元。 正文 斯坦福的通用操作接口&#xff08;UMI…

WildCard:一个因太好用而被迫暂停服务的虚拟信用卡平台,魅力何在?

如果你需要使用Wildcard开通GPT4、Midjourney或是Only方式的话&#xff0c;请点击&#xff1a;WildCard使用教程 参考文章链接&#xff1a;WildCard&#xff1a;一个因太好用而被迫暂停服务的虚拟信用卡平台&#xff0c;魅力何在&#xff1f; 1、Wildcard用户数量激增&#x…

Windows 编译 yangfengzzz/fluid-engine-OpenVDB

我想将 OpenVDB 接入 doyubkim 的流体引擎 https://github.com/doyubkim/fluid-engine-dev 然后搜到已经有人做过这件事了 https://github.com/yangfengzzz/fluid-engine-OpenVDB Windows 编译 yangfengzzz/fluid-engine-OpenVDB 但是我是 windows&#xff0c;所以想要编译…

MySQL系列之索引入门(下)

前言 通过上文&#xff0c;我想各位盆友已熟悉MySQL的索引分类及其含义&#xff0c;那么如何合理的使用呢&#xff1f; 请继续围观此文&#xff0c;一探究竟&#xff01; 一、创建索引 首先&#xff0c;我们一起学习索引是如何创建的&#xff0c;又有哪些方式。 1. create t…

VO、DTO、DO、BO、PO

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 VO、DTO、DO、BO1.概念阿里Java开发手册分层领域模型&#xff1a; 2. VO 和 DTO 使用场景以下是一个使用VO和DTO的典型案例&#xff1a; 3.BO和DTO的区别 案例 VO、…

数据结构1.0(基础)

近java的介绍&#xff0c; 文章目录 第一章、数据结构1、数据结构 &#xff1f;2、常用的数据结构数据结构&#xff1f; 逻辑结构and物理结构 第二章、数据结构基本介绍2.1、数组&#xff08;Array&#xff09;2.2、堆栈&#xff08;Stack&#xff09;2.3、队列&#xff08;Que…

宝塔安装MySQL、设置MySQL密码、设置navicat连接

1、登录宝塔面板进行安装 2、设置MySQL连接密码 3、安装好了设置navicat连接 登录MySQL [roothecs-394544 ~]# mysql -uroot -p Enter password: 切换到MySQL数据 mysql> use mysql Database changed mysql> 查询用户信息 mysql> select host,user from user; ---…

数据脱敏(四)脱敏算法-替换算法

脱敏算法篇使用阿里云数据脱敏算法为模板,使用算子平台快速搭建流程来展示数据 "替换脱敏"是一种数据处理技术&#xff0c;主要用于保护个人隐私和数据安全。它通过将敏感信息&#xff08;如姓名、身份证号、电话号码等&#xff09;替换为无意义或随机的字符&#xf…

完整的 vue-router 导航解析流程

在Vue.js中&#xff0c;vue-router是一个官方提供的路由管理器&#xff0c;它能够帮助我们实现页面之间的无缝切换和导航。 本文将深入探讨vue-router的导航解析流程&#xff0c;并通过示例代码演示如何使用vue-router实现完整的导航过程。 首先&#xff0c;让我们来了解一下…

Linux环境安装Maven(详细图文)

目录 摘要 一、准备工作 1.检查当前环境是否安装maven 2.下载maven ​3.上传maven压缩包 4.解压maven包 5.移动到/usr/local目录下方便管理 6.配置maven环境变量 7.刷新配置文件 8.配置maven镜像仓库 9.验证是否成功 摘要 笔者Linux环境为&#xff1a;Ubuntu 22.04 …

解决Webstorm2023使用账号连接GitLab的问题personal access token instead of a password

问题 升级Webstorm之后&#xff0c;发现gitlab仓库拉取代码报错 报错信息 remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token instead of a password. See https…

【论文精读】BERT

摘要 以往的预训练语言表示应用于下游任务时的策略有基于特征和微调两种。其中基于特征的方法如ELMo使用基于上下文的预训练词嵌入拼接特定于任务的架构&#xff1b;基于微调的方法如GPT使用未标记的文本进行预训练&#xff0c;并针对有监督的下游任务进行微调。 但上述两种策略…

kettle中JavaScript使用例子

1.将输入日期减一后&#xff0c;得到对应格式的输出 输入为20240216则Alert输出20240215 日期减一。 对应函数参考&#xff1a; https://blog.csdn.net/doasmaster/article/details/112978529

Windows11(非WSL)安装Installing llama-cpp-python with GPU Support

直接安装&#xff0c;只支持CPU。想支持GPU&#xff0c;麻烦一些。 1. 安装CUDA Toolkit (NVIDIA CUDA Toolkit (available at https://developer.nvidia.com/cuda-downloads) 2. 安装如下物件&#xff1a; gitpythoncmakeVisual Studio Community (make sure you install t…

day03-股票数据报表与导出

day03-股票数据表报与导出 目标 理解涨幅榜业务需求;理解涨停跌停概念&#xff0c;并涨停跌停基本实现;理解涨停跌停SQL分析流程&#xff0c;并根据接口文档自定义实现;理解echarts基本使用;掌握easyExcel基本使用,并实现涨幅榜数据导出功能; 第一章 股票涨幅统计 1、涨幅榜…

【spring】@Transactional 注解失效的原因及解决办法

文章目录 前言一、Transactional 属性介绍1.事务的传播行为&#xff1a;propagation2.事务的隔离级别&#xff1a;isolation3.事务的超时时间&#xff1a;timeout4.事务的回滚类型&#xff1a;rollbackFor 二、Transactional 失效场景1.同一个类中方法调用&#xff0c;注解失效…

Visual Studio+C#实现信道与信息率失真函数

1. 要求 设计一款信道与信息率失真函数计算系统&#xff0c;要求如下&#xff1a; 系统能够通过输入的转移概率矩阵计算对称以及非对称离散无记忆信道的信道容量系统能够通过输入的概率分布以及失真矩阵来计算与信息率失真函数有关的相关参数&#xff0c;例如Dmin&#xff0c…

分布式学习笔记

1. CAP理论 Consistency&#xff08;一致性&#xff09;&#xff1a;用户访问分布式系统中的任意节点&#xff0c;得到的数据必须一致。 Availability&#xff08;可用性&#xff09;&#xff1a;用户访问集群中的任意健康节点&#xff0c;必须得到相应&#xff0c;而不是超时…