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

news2025/1/23 7:58:30

文章目录

  • 前言
  • 一、连接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.coloradmin.cn/o/1454616.html

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

相关文章

Python:异常处理

异常处理已经成为判断一门编程语言是否成熟的标准&#xff0c;除传统的像C语言没有提供异常机制之外&#xff0c;目前主流的编程语言如Python、Java、Kotlin等都提供了成熟的异常机制。异常机制可以使程序中的异常处理代码和正常业务代码分离&#xff0c;保证代码更加优雅&…

机器学习第二十八周周报 PINNs2

文章目录 week28 PINNs2摘要Abstract一、Lipschitz条件二、文献阅读1. 题目数据驱动的偏微分方程2. 连续时间模型3. 离散时间模型4.结论 三、CLSTM1. 任务要求2. 实验结果3. 实验代码3.1模型构建3.2训练过程代码 小结参考文献 week28 PINNs2 摘要 本文主要讨论PINN。本文简要…

vue-路由(六)

阅读文章你可以收获什么&#xff1f; 1 明白什么是单页应用 2 知道vue中的路由是什么 3 知道如何使用vueRouter这个路由插件 4 知道如何如何封装路由组件 5 知道vue中的声明式导航router-link的用法 6 知道vue中的编程式导航的使用 7 知道声明式导航和编程式导航式如何传…

代码随想录算法训练营DAY19 | 二叉树 (6)

一、LeetCode 654 最大二叉树 题目链接&#xff1a;654.最大二叉树https://leetcode.cn/problems/maximum-binary-tree/ 思路&#xff1a;坚持左开右闭原则&#xff0c;递归划分数组元素生成左右子树。 class Solution {public TreeNode constructMaximumBinaryTree(int[] num…

数字人如何激发广电内容创新可能性?

在数字化传播时代&#xff0c;数字人的兴起对激发传统文化的内在活力具有重要意义。如河南广电以《唐宫夜宴》中唐代仕女为原型设计&#xff0c;推出身穿三彩襦裙的数字人“唐小妹”&#xff0c;目前数字人“唐小妹”已在河南卫视中国节日系列的多个节目中出现&#xff0c;带给…

【算法】C语言使用qsort对字符串字符进行排序(解决字符串长度不统一的问题)

核心思想是 当a的长度>b时&#xff0c;a一定比b大当a,b长度相等时&#xff0c;通过strcmp比较哪个字典序大&#xff0c;也就是实际的数哪个大当a的长度&#xff1c;b是&#xff0c;b一定比a大 这时候就不得不感慨C的string是多么好用的&#xff0c;哎 #include<stdio.h…

由于找不到MSVCP140.dll无法运行软件游戏,多种解决方法分享

电脑系统在运行过程中&#xff0c;当出现“由于找不到MSVCP140.dll”这一提示时&#xff0c;可能会引发一系列潜在的问题与影响。当电脑无法找到这个特定的dll文件时&#xff0c;意味着相关应用可能无法顺利加载并执行必要的组件&#xff0c;进而导致程序无法启动或运行过程中频…

基于SpringBoot+WebSocket+Spring Task的前后端分离外卖项目-订单管理(十七)

订单管理 1. Spring Task1.1 介绍1.2 cron表达式1.3 入门案例1.3.1 Spring Task使用步骤1.3.2 代码开发1.3.3 功能测试 2.订单状态定时处理2.1 需求分析2.2 代码开发2.3 功能测试 3. WebSocket3.1 介绍3.2 入门案例3.2.1 案例分析3.2.2 代码开发3.2.3 功能测试 4. 来单提醒4.1 …

基于微信小程序的校园跑腿系统的研究与实现,附源码

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

无锁、偏向锁、轻量级锁、重量级锁

无锁、偏向锁、轻量级锁、重量级锁 1、偏向锁、轻量级锁、重量级锁适用于不同的并发场景 偏向锁&#xff1a;无实际的锁竞争&#xff0c;且将来只有第一个申请锁的线程会使用锁。偏向锁只有初始化时需要一次CAS 轻量级锁&#xff1a;无实际的锁竞争&#xff0c;多个线程交替使…

论文阅读-EMS: History-Driven Mutation for Coverage-based Fuzzing(2022)模糊测试

一、背景 本文研究了基于覆盖率的模糊测试中的历史驱动变异技术。之前的研究主要采用自适应变异策略或集成约束求解技术来探索触发独特路径和崩溃的测试用例&#xff0c;但它们缺乏对模糊测试历史的细粒度重用&#xff0c;即它们在不同的模糊测试试验之间很大程度上未能正确利用…

SG7050EAN规格书

SG7050EAN 晶振是EPSON/爱普生的一款额定频率73.5 MHz ~ 700mhz的石英晶体振荡器&#xff0c;7050封装常规有源晶振&#xff0c;4脚贴片&#xff0c;具有小尺寸&#xff0c;高稳定性。SG5032EAN 晶体振荡器结合了相位锁定环&#xff08;PLL&#xff09;技术和AT切割晶体单元&am…

Unity中,C#的事件与委托区别和经典实例

文章目录 实例1&#xff1a;委托&#xff08;Delegate&#xff09;的基本用法实例2&#xff1a;事件&#xff08;Event&#xff09;的声明与订阅实例3&#xff1a;Unity引擎中的委托实例 - UI Button.onClick实例4&#xff1a;事件&#xff08;Event&#xff09;的安全性实例5&…

ViT: transformer在图像领域的应用

文章目录 1. 概要2. 方法3. 实验3.1 Compare with SOTA3.2 PRE-TRAINING DATA REQUIREMENTS3.3 SCALING STUDY3.4 自监督学习 4. 总结参考 论文&#xff1a; An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 代码&#xff1a;https://github.com…

2024几个测试接口的好工具,效率加倍~

作为一名后端程序员&#xff0c;一定要对自己写的接口负责&#xff0c;保证接口的正确和稳定性。因此&#xff0c;接口测试也是后端开发中的关键环节。 但我相信&#xff0c;很多朋友是懒得测试接口的&#xff0c;觉得这很麻烦。一般自己写的接口自己都不调用&#xff0c;而是…

Acwing---877. 扩展欧几里得算法

扩展欧几里得算法 1.题目2.基本思想3.代码实现 1.题目 给定 n n n 对正整数 a i ai ai, b i bi bi&#xff0c;对于每对数&#xff0c;求出一组 x i xi xi, y i yi yi&#xff0c;使其满足 a i x i b i y i g c d ( a i , b i ) aixibiyigcd(ai,bi) aixibiyigcd(ai,bi)…

Diffusion Model——扩散模型

Diffusion Model 文章目录 Diffusion ModelDenoising Diffusion Probabilistic Model(DDPM)去噪过程&#xff1a;Denoise结构训练过程Text-to-image Generation Model High Resolution Image Synthesis With_Latent Diffusion Models (Stable Diffusion)基本结构与推理过程Text…

基于scrapy框架的单机爬虫与分布式爬虫

我们知道&#xff0c;对于scrapy框架来说&#xff0c;不仅可以单机构建复杂的爬虫项目&#xff0c;还可以通过简单的修改&#xff0c;将单机版爬虫改为分布式的&#xff0c;大大提高爬取效率。下面我就以一个简单的爬虫案例&#xff0c;介绍一下如何构建一个单机版的爬虫&#…

WGS-84坐标系、东北天坐标系、载体坐标系

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、WGS-84坐标系二、东北天坐标系&#xff08;ENU&#xff09;1、站心直角坐标系2、站心极坐标系 三、载体坐标系总结 前言 作为一名智驾HIL工程师&#xff0…

My desktop didn‘t come with the Bluetooth.

You didnt turn on the Bluetooth on PC and phone.Turn on it to control your phone. My desktop didnt come with the Bluetooth. 电脑控制手机的时候&#xff0c;电脑蓝牙没打开 电脑蓝牙打开步骤 电脑蓝牙的小图标打开了 手机上可以看到计算机了【Thinkpad-T440p-zwf】 无…