WIFI(1)

news2025/1/18 6:09:45

WIFI(1)

目录

WIFI(1)

回顾

WIFI模块

-- 1、AP模式:(服务器)应用:主要是用来让用户设置自身的wifi密码

-- 2、STA模式:可以获取时间获取天气

应用:

代码编写


回顾

-- SPI&FLASH

应用:读写

关注点:写:写入地址 数据大小 (写入数据之前,要先擦除。擦除函数需要一定的时间,大量擦除之前最好要加延时)
对于flash咱们能够操作的最小单位是:

读:读出的地址 储存数据空间的大小
读写都不要出现数组越界的现象(不要数组的长度过大)

栈区:存放的是局部变量(栈区空间不要开的太大,不要定义一个数据长度很大的数组)

理论内容要掌握(重要):
SPI的工作原理,FLASH的时序图

WIFI模块

-- 我们讲的这个WIFI模块用来干什么?为了让设备进行联网:用来更新时间,天气信息,还有就是连接云服务器

-- 哪些模块能让设备联网呢?
wifi模组:esp8266,esp32 (联网需要依靠热点,局域网通信)
4G模组, Nb模组。。。

ESP8266:WIFI MCU
ESP32:集成wifi和蓝牙 厂家乐鑫

例如:ESP8266开发板-----硬件产品

ESP8266模组:开发:底层固化软件。

esp8266和esp32可以更新固件

-- 底层固件是什么?类似于前面讲的语音模块的固件(su03t)

-- esp8266会用到AT指令集

-- 什么是AT指令集?

-- 查看手册

alt text

alt text

  1. 指令格式:(AT)开头 +数据+ (回车+换行)结尾 串口传输方式:
    默认波特率:115200
    字符串:”AT+数据+换行”
    串口转WIFI

  2. 指令分类:3类

alt text

  1. 应用指令

alt text

-- esp8266和单片机通信的是串口通信,在通信过程中会用到AT指令。


-- ESP8266WIFI设置3种无线通信模式:

  • AP模式:ESP8266产生WIFI网络,其他设备加入该网络。
    指的就是服务器模式。

  • 无线终端模式(STA模式):加入别人创建WIFI网络,ESP8266加入该网络 -- 局域网通信(客户端),STA模式还可以连接手机热点

一个WIFI模块可以设置为AP模式,另一个WIFI模块可以设置为STA模式,这样两个模块就可以进行局域网通信了。

  • 混合模式:上面两个模式都可以用,但是同一时间只能用一种模式。

-- WIFI模块,驱动依靠AT指令。想实现任何功能,都要依靠AT指令。想实现什么功能,就要找不同的AT指令。

-- AP模式和STA模式具体是怎么实现的? 找一找实现这两种模式需要什么AT指令,顺序是什么?

-- 注意这里可以先把代码编写好,然后再去查找AT指令,这样就可以直接在串口助手中试了

-- 注意:代码编译成功后,进入串口调试,打开串口后,记得复位,之后再输指令

-- 如何向wifi模块发送这个指令?通过串口连接

-- 1、AP模式:(服务器)应用:主要是用来让用户设置自身的wifi密码

-- 可以通过指令集的官方文档看指令的具体用法 

alt text

-- 注意:AT指令是以换行符为结束,要将串口助手中的发送新行选中。 

alt text

-- tip:要发送多条指令时: 

alt text

-- 注意:指令要按顺序执行

AP模式的AT指令:

1、"AT\r\n"发一个基本的AT指令,查看模块是否正常工作(检测一个AT指令的模块是好是坏

-- 注意:AT和OK都是wifi模块发的

2、"AT+RST\r\n":模块复位

3、"AT+CWMODE=2\r\n" :设置WiFi模块的模式 (1:STA模式 2:AP模式 3:混合模式)

4."AT+CWSAP="ESP8266","1234567890",5,3\r\n" //设置模块的热点名称和密码(但是这个wifi不能联网)注意:密码是8位及以上,根据指令集文档可以看出 

alt text

5."AT+CIPMUX=1\r\n" 启动多连接模式

6、"AT+CIFSR\r\n" 获取本地的IP地址 

alt text

7."AT+CIPSERVER=1,8086\r\n" 设置本地的端口号,连接的时候需要用到该端口号

8.AT+CIPSTO=5000 设置超时时间(设不设无所谓)

-- 要想进行通信,手机应该先连接到ESP8266模块产生的热点,然后下载APP 

alt text

-- 之后,先连接本地IP(就是上面执行指令生成的本地IP)

alt text

-- 连接成功后,会有显示

alt text

-- 之后输入wifi和密码,然后发送

alt text

-- 发送成功过后, 串口上将会显示出连接自己的方法,将得到的数据解析出来,存在flash里,解析数据,得到名称密码,保存到FLASH里面,后续要连接WiFi的时候,就可以直接从flash里读了 

alt text

-- 效果图 

alt text

-- 2、STA模式:可以获取时间获取天气

-- 上网搜索AT指令: 

alt text


-- 注意:指令要按顺序执行

1、"AT\r\n"发一个基本的AT指令,查看模块是否正常工作(检测一个AT指令的模块是好是坏

2、"AT+RST\r\n":模块复位

3、"AT+CWMODE=1\r\n" :设置WiFi模块的模式 (1:STA模式 2:AP模式 3:混合模式)

4、"AT+CIPMUX=0\r\n", //设置模块为单路连接模式(不写也可以,因为默认是单路模式)

5、"AT+CWJAP="WIFI名称","密码"\r\n"(热点必须是2.4G频段) //连接网络(注意:不要将wifi设置成5G)

6、"AT+CIPSTART="TCP","pinduoduo.com",80\r\n"//连接TCP服务器,taobao.com是服务器IP地址,8080是服务器端口。

7、"AT+CIPMODE=1\r\n" //开启透传模式

8、AT+CIPSEND //开始发送数据

-- 下面如何从淘宝服务器中获取时间?

-- 之后再向WIFI模块发送指令,不会再当作指令,而是当作数据发送给拼多多服务器。例如获取拼多多服务器时间的指令"GET http://api.pinduoduo.com/api/server/_stm\r\n"

-- 注意:与服务器通信完成后,再退出透传和关闭服务器,因为退出后将无法通信。

-- 9、"+++" //退出透传(注意:不加换行,要将串口助手中的“发送新行取消选中”)(退出之后不能再与服务器进行通信,所以一般在要退出服务器时(或者要连其他服务器),再写指令)

-- 发送完"+++"指令后串口不会发送任何数据

-- 注:发送完"+++"指令后,注意将串口助手中的“发送新行重新选中”

-- 10、"AT+CIPCLOSE\r\n" //关闭服务器


-- 连接不同的服务器应该如何操作:

  • 1、退出透传
  • 2、关闭上一个服务器
  • 3、连接新的服务器
  • 4、开启透传
  • 5、启动发送

指令上面都有


应用:

-- 1、获取拼多多服务器的时间:

  • 依次执行上述指令,拼多多的IP是pinduoduo.com,端口号是80,连接服务器,继续执行指令,知道执行完发送数据的指令后,执行从拼多多服务区获取时间的指令"GET http://api.pinduoduo.com/api/server/_stm\r\n"//访问这个地址,这个可以在网上搜到

  • 之后,会获得一个时间戳,要将时间解析出来(将年月日时分秒解析出来) 

    alt text

获得的单位是毫秒,要去掉后三位,还要讲字符串转成数字(atoi,atol,atoll(这三个有不同的数字转换范围))再传给RTC


-- 2、之后换服务器换成苏宁的服务器,获取苏宁服务器的时间,步骤和上面一样。

  • 先发送"+++"指令,退出透传

  • 再发送退出服务器的指令"AT+CIPCLOSE\r\n"

  • 之后再连接苏宁服务器,苏宁服务器的IP是suning.com,端口号是80

  • 连接之后,开启透传模式

  • 之后开启发送数据

  • 发送获取suning服务器的指令,"AT+CIPSTART="TCP","suning.com",80\r\n" 

    alt text

-- 年份4字节,月份和日都是2字节

-- 首先解析第一个字节,是{,怎么定位到要解析的字节呢,笨方法直接数,一个字节一个字节数,这里数的话是从第13位开始就是sysTime2的数据。

-- 可以用函数找,strstr字符串查找函数,找到第一个字节的位置,然后从该位置开始解析。

查找第一个数的话,可以用strstr函数,找“sysTIME”,得到的是他的首地址,然后根据地址偏移偏过去。

tip:注意,有的指令不能乱用,例如

alt text

代码编写

  • 1、查看单片机原理图找到wifi模块对应引脚,分别是PB10,PB11和PE6

alt text

虽然原理图上显示使能引脚连接的是电压, 但实际的板子上没有焊接相关的器件,所以还是要在代码中使能(也就是将带使能引脚置1)

  • 2、根据原理图上找到的相关引脚配置IO
    //时钟 B端口  USART3(外设自身也有时钟)
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);			//看数据手册在哪条线上 - APB1
	
	//IO PA9/PA10
	GPIO_InitTypeDef GPIO_InitStructure = {0};						//定义结构体变量,并且将结构体变量赋初值
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 						//引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;			//速度
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//PA9 复用推挽
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; 							//引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;		//浮空输入
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //ESP_EN使能引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_Init(GPIOE, &GPIO_InitStructure);
  
	GPIO_SetBits(GPIOE,GPIO_Pin_6);//置1//使能位置一
  • 3、配置串口3和中断
    USART_InitTypeDef USART_InitStructure = {0};
	USART_InitStructure.USART_BaudRate = 115200;   					 			//波特率  常用的是4800 9600  115200
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;	//数据位长度
	USART_InitStructure.USART_StopBits = USART_StopBits_1;			//停止位长度
	USART_InitStructure.USART_Parity = USART_Parity_No;				//奇偶校验(这里写不使用)
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制失能(不使用硬件流控制)
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//模式
	USART_Init(USART3, &USART_InitStructure);
	
	USART_Cmd(USART3,ENABLE);//开启串口    //使能或者失能 USART 外设(一般外设都要写这个)
	
	
	//使能中断源			//串口有10个,用哪一个就要开哪一个中断源
	USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);

    //中断
	NVIC_InitTypeDef NVIC_InitStructure = {0}; 
	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能(使能哪个中断通道,就要写哪个(必须写)中断服务函数)
	NVIC_Init(&NVIC_InitStructure);
  • 4、编写发送函数

-- 需要发送的AT指令是不定长的,所以需要写一个不定长发送函数

    void uart3_tx(uint8_t data)
    {
        while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET){}
        USART_SendData(USART3, data); 
    }

    void uart3_txstr(uint8_t *buff)
    {
        while( *buff )      //字符串结尾是\0,就是数字0,遇到0结束
        {
            uart3_tx(*buff);
            buff++;
        }
    }

  • 5、中断服务函数

-- 想看到wifi模块回应的响应,例如AT指令回应ok,还需要些接收的代码。写在中断服务函数里。

-- 接收到函数还需要被我们知道,要通道串口调试工具显示(xcom)出来,但是中断函数里面不能写printf函数,我们可以写其他的代替。

-- 已知printf的本质是串口1的发送(函数),

    USART_SendData(USART1, data);

-- 串口1会将数据传给串口调试工具(xcom)显示出来,那么我们就可以利用串口1发送数据将数据显示在串口调试工具中

alt text

-- 注意:这里串口3和串口1的波特率要一致

void USART3_IRQHandler(void)//串口收到1字节数据,中断就会被触发一次
{
	uint8_t data;
	//判断接收中断是否发生
	if(USART_GetITStatus(USART3, USART_IT_RXNE) == SET)
	{
		//处理中断:保存数据
		data = USART_ReceiveData(USART3);
		USART_SendData(USART1, data);
		//usart1_len %= 10;//对10求余,他就一直会小于10
		//清理终端
		USART_ClearITPendingBit(USART3,USART_IT_RXNE);
	}
}

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

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

相关文章

暴力破解案例

暴力破解 1 概述 暴力破解,是一种针对密码的破译方法,将密码进行逐个推算直到找出真正的密码为止。 2 爆破HTTP协议 第一步:实验性发送请求成功 import requests url "http://192.172.0.100:8080/woniusales/user/login"data {"use…

CUDA - nvprof 性能刨析

nvprof 是一个可执行文件&#xff0c;使用everything搜索可以看到它在&#xff1a; 执行命令&#xff1a; nvprof exe_name 如何在windows 下使用&#xff0c;可以参看: windows下使用nvcc和nvprof。 示例 #include <cuda_runtime.h> #include <device_launch_par…

YOLOv8实战水果识别【数据集+YOLOv8模型+源码+PyQt5界面】

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对水果数据集进行训练和优化&#xff0c;该数据集包含丰富的水果图像样本&#xf…

Merlion笔记(二):单变量时间预测

1 简单示例 我们首先导入Merlion的TimeSeries类和M4数据集的数据加载器。然后&#xff0c;我们可以将该数据集中的特定时间序列划分为训练集和测试集。 from merlion.utils import TimeSeries from ts_datasets.forecast import M4time_series, metadata M4(subset"Hou…

ClickHouse入库时间与实际相差8小时问题

原因一&#xff1a;服务端未修改默认时区 解决方案&#xff1a; 1、找 ClickHouse 配置文件 config.xml&#xff0c;通常位于 /etc/clickhouse-server/ 目录。 2、编辑 config.xml 文件&#xff0c;找到 标签。如果标签不存在&#xff0c;需要手动添加。 3、修改 标签的内容为 …

docker部署dvwa靶场

一、简述前情 最近差不多又是网安专业的同学搭建靶场的时候了&#xff0c;DVWA&#xff08;Damn Vulnerable Web Application&#xff09;是安全入门者们最为熟知的练习靶场&#xff0c;它能够帮助小白对常见的安全问题进行理解&#xff0c;并且随着理解问题的深入自主调整靶场…

Redis-02 数据持久化

redis持久化即将数据从内存写入磁盘&#xff0c;Redis提供了两种持久化的方式&#xff1a;RDB和AOF。 1.RDB RDB持久化&#xff1a;Redis可以将内存中的数据定期快照保存到磁盘上的一个二进制文件中。RDB持久化是一种比较紧凑的文件格式&#xff0c;适用于备份和灾难恢复。通过…

vue3中监视 Reactive对象中的属性

watch 的第一个参数可以是不同形式的“数据源”&#xff1a;它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组 一、框架&#xff1a; <template><div class"divBox"><h2>姓名&#xff1a;{{ person.…

【深圳大学/大学物理实验2】超声探伤实验 实验前预习题答案参考

一、单选题 共 6 小题 共 31 分 1. (5分)电偶极矩的单位是&#xff08; &#xff09; 学生答案&#xff1a;B √ A. B. C. D. 2. (5分)本实验中产生超声波的方法是&#xff08; &#xff09; 学生答案&#xff1a;D √ A. 热电效应 B. 光电效应 C. 电磁效应 D. 压电效…

【专题】关系数据库标准语言SQL

1. SQL语言介绍 SQL(Structured Query Language)是结构化查询语言&#xff0c;它是一种在关系数据库中定义和操纵数据的标准语言&#xff0c;是用户与数据库之间进行交流的接口。 1.1 SQL数据库的体系结构 使用SQL关系数据库的特点&#xff1a; SQL用户可以是应用程序&#xf…

闯关leetcode——100. Same Tree

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/same-tree/description/ 内容 Given the roots of two binary trees p and q, write a function to check if they are the same or not. Two binary trees are considered the same if they are…

PHP简单登录系统

目录 用户数据文件 (users.php) HTML 登录表单 (login.html) PHP 登录处理脚本 (login_process.php) 欢迎页面 (welcome.php) 注销脚本 (logout.php) 效果展示 用户名和密码错误时 用户名和密码正确时 用户数据文件 (users.php) 用于保存用户信息&#xff0c;用户名和他…

【PUSCH的时域资源分配】

DCI format 0_0/0_1用于调度PDSCH传输&#xff0c;每种格式都包含了时域和频域资源的分配字段。 和PDSCH一样&#xff0c;PUSCH也支持Type A和Type B两种映射类型&#xff0c;但是有效的S和L组合不同。 同样&#xff0c;当UE通过DCI调度PUSCH时&#xff0c;DCI的时域资源分配…

日语学习柯桥外语培训jlpt备考「意地」是什么意思?

「意地」 N1单词 意地&#xff08;いじ&#xff09; 词性&#xff1a;名词 含义&#xff1a;心术&#xff0c;用心&#xff1b;固执&#xff0c;倔强&#xff1b;志气&#xff0c;气魄&#xff1b;嘴馋&#xff0c;贪婪 例句&#xff1a; ▲自分が始めたことだから意地でもや…

长三角智驾花絮

杜轩第一次去说服清洁工&#xff0c;收养狗儿&#xff0c;结果清洁工说有人收养了狗&#xff0c;结果狗引起交通事故主人赔钱。第二次尝试说服大妈收养狗儿&#xff0c;大妈给狗儿一脚&#xff0c;说狗儿把她厕所搞脏了。第三次看路上的美女&#xff0c;去说服美女收养&#xf…

UE5运行时动态加载场景角色动画任意搭配-全流程代码(四)

UE5运行时动态加载场景、角色、角色动画、相机动画任意搭配,Android、iOS也可以跑,横竖屏兼容,手机竖屏: 1、场景切换UWorld处理 在通过OpenLevel进行场景切换的时候,UWorld会发生变化,需要我们获取正确的UWorld。 1、在GameInstance监听Level加载 void UMyGameInsta…

nemo-guardrails简单应用

环境&#xff1a;openEuler、python 3.11.6、nemoguardrails 0.10.1、Azure openAi 背景&#xff1a;工作需要&#xff0c;进行调研期间&#xff0c;发现问题太多&#xff0c;且国内网站好多没说明具体问题 时间&#xff1a;20241014 说明&#xff1a;搭建过程中主要是下载h…

ARMA3 STATUS_ACCESS _VIOLATION退出解决方法测试

方法1 [SOLVED] 0xc0000005 status_access_violation ARMA 3 (youtube.com) 启动器-参数-平台 改32位。 没卵用。 方法2 ArmA 3 "STATUS_ACCESS_VIOLATION" FIX!! [2018] (youtube.com) steam-ARMA3-属性-通用-启动选项&#xff1a;粘贴路径&#xff0c;后面加-…

基于FPGA的以太网设计(三)

通过前文介绍了RGMII接口时序我们可以知道&#xff0c;RGMII接口是在时钟信号的上升沿和下降沿均进行数据的传输&#xff0c;而FPGA则在时钟的单沿传输数据&#xff0c;因此我们需要编写代码将RGMII接口转换为GMII接口。 由于前面的介绍我们知道RTL8211默认工作在延时状态&…

体能攻略梳理

最近在锻炼身体&#xff0c;但如何才能更好的锻炼&#xff1f;最近看了慕课上的体能攻略&#xff08;https://www.icourse163.org/learn/HZIC-1206696841&#xff09;&#xff0c;讲的特别好。希望大家看了就是会了&#xff0c;看了就是做了&#x1f601;。 基本知识 减脂别只…