【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可以实现丰富的物联网功能,为各种物联网应用提供了强大的支持和保障。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java的泛型【详解】

定义类、接口、方法时&#xff0c;同时声明了一个或者多个类型变量&#xff08;如&#xff1a;<E>&#xff09; &#xff0c;称为泛型类、泛型接口&#xff0c;泛型方法、它们统称为泛型。 作用&#xff1a;泛型提供了在编译阶段约束所能操作的数据类型&#xff0c;并自…

Mac M1芯片编译openjdk报错问题解决

使用命令&#xff1a; sudo sh configure --with-target-bits64 用mac m1芯片编译openjdk一直报错&#xff1a; configure: The tested number of bits in the target (64) differs from the number of bits expected to be found in the target (32) configure: error: Cann…

C++ 调用js 脚本

需求&#xff1a; 使用Qt/C 调用js 脚本。Qt 调用lua 脚本性能应该是最快的&#xff0c;但是需要引入第三方库&#xff0c;虽然也不是特别麻烦&#xff0c;但是调用js脚本&#xff0c;确实内置的功能&#xff08;C 调用lua 脚本-CSDN博客&#xff09; 步骤&#xff1a; 1&…

零基础搭建 Kubernetes 集群

零基础搭建 Kubernetes 集群 1、简介 在数字化时代&#xff0c;容器技术已经变成了软件开发和部署的标准&#xff0c;而在众多容器管理工具中&#xff0c;Kubernetes&#xff08;简称为 K8s&#xff09;凭借其高效的资源管理、弹性伸缩和自我修复的能力&#xff0c;成为了行业…

三防平板电脑丨亿道工业三防平板丨三防平板定制丨机场维修应用

随着全球航空交通的增长和机场运营的扩展&#xff0c;机场维护的重要性日益凸显。为确保机场设施的安全和顺畅运行&#xff0c;采取适当的措施来加强机场维护至关重要。其中&#xff0c;三防平板是一种有效的工具&#xff0c;它可以提供持久耐用的表面保护&#xff0c;使机场维…

最简单的基于 FFmpeg 的视频编码器(YUV 编码为 HEVC(H.265))

最简单的基于 FFmpeg 的视频编码器&#xff08;YUV 编码为 HEVC&#xff08;H.265&#xff09;&#xff09; 最简单的基于 FFmpeg 的视频编码器&#xff08;YUV 编码为 HEVC&#xff08;H.265&#xff09;&#xff09;正文结果工程文件下载 最简单的基于 FFmpeg 的视频编码器&a…

【开源】SpringBoot框架开发高校宿舍调配管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统展示四、核心代码4.1 查询单条个人习惯4.2 查询我的室友4.3 查询宿舍4.4 查询指定性别全部宿舍4.5 初次分配宿舍 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的…

基于ESP32+Platformio的物联网RTOS_SDK-CC_Device

本项目基于ESP32以及Platformio平台开发&#xff0c;请自行查阅如何配置这个环境 开源gitee地址&#xff1a;cc_smart_device 如果愿意贡献项目or提出疑问和修改的&#xff0c;请在gitee上提issue 文章目录 1 基本介绍2 基本架构3 中间件3.1 RTOS部分3.1.1 互斥锁3.1.2 信号量3…

Academic Inquiry|投稿状态分享(ACS,Wiley,RSC,Elsevier,MDPI,Springer Nature出版社)

作为科研人员&#xff0c;我们经常会面临着向学术期刊投稿的问题。一般来说&#xff0c;期刊的投稿状态会在官方网站上进行公示&#xff0c;我们可以通过期刊的官方网站或者投稿系统查询到我们投稿的论文的状态&#xff0c;对于不同的期刊在投稿系统中会有不同的显示。 说明&am…

Eclipse - Format Comment

Eclipse - Format & Comment 1. Correct Indentation2. Format3. Toggle Comment4. Add Block Comment5. Remove Block CommentReferences 1. Correct Indentation Ctrl A: 选择全部代码 Ctrl I: 校正缩进 or right-click -> Source -> Correct Indentation 2. F…

Qt 使用QScintilla 编辑lua 脚本

需求&#xff1a; 利用QScintilla 编辑lua 脚本 步骤&#xff1a; 1&#xff0c;下载 QScintilla Riverbank Computing | Download 2, 打开 src/qscintilla.pro 文件 编译出 dll库 3&#xff0c;工程中引入这个库 注意debug 模式 必须加载debug 版本编译的库&#xff0…

Eclipse - Colors and Fonts

Eclipse - Colors and Fonts References 编码最好使用等宽字体&#xff0c;Ubuntu 下自带的 Ubuntu Mono 可以使用。更换字体时看到名字里面带有 Mono 的基本都是等宽字体。 Window -> Preferences -> General -> Appearance -> Colors and Fonts -> C/C ->…

沁恒CH32V30X学习笔记01--创建工程

资料下载 https://www.wch.cn/products/CH32V307.html? 下载完成后安装MounRiver Studio(MRS) 创建工程 修改时钟144M printf重定向 修改外部晶振频率位置 添加自定义文件 添加目录

HttpClient:HTTP GET请求的服务器响应输出

前言 在现代软件开发中&#xff0c;与网络通信相关的技术变得愈发重要。Java作为一种强大而灵活的编程语言&#xff0c;提供了丰富的工具和库&#xff0c;用于处理各种网络通信场景。本文将聚焦在Java中使用HttpClient库发送HTTP GET请求&#xff0c;并将服务器的响应数据进行…

《游戏引擎架构》--学习

内存管理 优化动态内存分配 维持最低限度的堆分配&#xff0c;并且永不在紧凑循环中使用堆分配 容器 迭代器 未完待续。。。

IDEA2021版热部署配置

第一步 Settings中搜索compiler 勾选上Build project automatically 第二步 按快捷键 CtrlAltShift/ 选择第一个Registry 勾选上 注&#xff1a;2021版IDEA 被迁移到了这里 第三步 第四步 pom.xml中添加 配置文件中添加 #springdevtools spring.devtools.restart.…

Python打发无聊时光:3.实现简单电路的仿真

看到这个标题肯定有人会问&#xff1a;好好的multisim、 proteus之类的专门电路仿真软件不用&#xff0c;非要写一个简陋的python程序来弄&#xff0c;是不是精神失常了。实际上&#xff0c;我也不知道为什么要这么干&#xff0c;前两篇文章是我实际项目中的一些探索&#xff0…

standalone安装部署

standalone是spark的资源调度服务&#xff1b;作用和yarn是一样的&#xff1b;standlone运行时的服务&#xff1a; master服务&#xff1b;主服务&#xff1b;管理整个资源调度&#xff1b;资源的申请需要通过master进行分配&#xff1b;类似于yarn里的ResourceManager;&#x…

BufferedImage 这个类在jdk17中使用哪个import导入

在Java开发中&#xff0c;BufferedImage 类是用于处理图像数据的一个类。在JDK 17中&#xff0c;BufferedImage 类属于 java.awt.image 包。因此&#xff0c;要在你的Java程序中使用 BufferedImage 类&#xff0c;你需要通过以下方式导入该类&#xff1a; import java.awt.ima…

Maven - Plugins报错的正确解决之道

背景&#xff1a; 正确解决之道&#xff1a; 在自己本地Maven的安装目录中找到自己的仓库地址目录&#xff1a;直接搜索自己报错的插件文件&#xff0c;把它们删除&#xff0c;如图&#xff1a; 接着回到IDEA点击Maven刷新按钮重新加载即可&#xff1a;已解决 反例&#xff1…