STM32实战指南——DHT11温湿度传感器驱动开发与避坑指南
知识点1【DHT11的概述】
1、概述
DHT是一款温湿度一体化的数字传感器(无需AD转换)。
2、驱动方式
通过单片机等微处理器简单的电路连接就能实时采集本地湿度和温度。DHT11与单片机之间采用单总线进行通信,仅需要一个IO口。
相对于单片机是片下外设,因此配置的时候无需使用复用方式,使用通用方式即可。
3、DHT11的数据结构
数据长度:40位
8bit的湿度整数,8bit的湿度小数,8bit的温度整数,8bit的温度小数+8bit的校验和位
知识点2【DHT11的使用】
DHT11一次通讯时间最大3ms,主机连续采样间隔建议不小于100ms
以上是理论,但实际使用中有所不同:
我们在实际使用中,连续采样间隔建议是 1s以上
补充
1、第一次采样前,我们打开DHT11后,即我们下面介绍的复位(void DHT11_Reset(void);
),需要等待2s以上,因为开启需要一个过程:DHT11 上电后内部有加热片和采集电路,需要约 1–2 s 的时间才能稳定到正常工作温度和电压;如果太快去读,传感器还没“热起来”,数据就不准。这里大家注意一下。
2、复用是针对于片上外设的,片下外设用通用模式即可
1、复位信号
①、DHT的复位信号,主机掌握数据总线
(1)拉低 至少18ms
(2)再拉高20-40us
②、DHT的响应信号,从机掌握数据总线
(1)拉低 40-50us
(2)再拉高40-50us
注意:此时DHT11对主机复位信号的响应信号
在DHT11中,数据(0和1)都是低电平开始的
2、DHT11表示1的方法
(1)拉低12-14us
(2)拉高116-118us
3、DHT11表示0的方法
(1)拉低12-14us
(2)拉高26-28us
因此我们这里区别 0 和 1 的方法就是利用的高电平的持续时间不同,利用这个时间差来判断是0还是1。
知识点3【代码演示】
main.c
#include "stm32f10x.h"
#include "stm32f10x_conf.h"
#include "delay.h"
#include "usart.h"
#include "DHT11.h"int flag = 0;int main(void)
{u8 data[5] = {0};//有限级组的配置Systick_Init(72);Usart1_Init(9600);while(1){ Delay_us(2000000);DHT11_RcvData(data);}
}
DHT11.c
**#include "DHT11.h"//端口结构体声明
GPIO_InitTypeDef GPIO_DHT11_InitStruct;//端口初始化
void DHT11_GPIO_Init(void)
{//开启时钟RCC_APB2PeriphClockCmd(DHT11_CLOCK,ENABLE);//配置GPIO引脚GPIO_StructInit(&GPIO_DHT11_InitStruct);GPIO_DHT11_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_DHT11_InitStruct.GPIO_Pin = DHT11_PIN;GPIO_DHT11_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOD,&GPIO_DHT11_InitStruct);}//复位
void DHT11_Reset(void)
{//时钟+模式配置DHT11_GPIO_Init();//复位信号发送//发0 20msGPIO_ResetBits(DHT11_GPIO,DHT11_PIN);Delay_us(20000);//发1 30msGPIO_SetBits(DHT11_GPIO,DHT11_PIN);Delay_us(30);//切换模式:上拉输入模式,准备接收DHT11应答GPIO_DHT11_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOD,&GPIO_DHT11_InitStruct);//等待引脚电平被拉低(等待DHT11的应答)while(GPIO_ReadInputDataBit(DHT11_GPIO,DHT11_PIN));
}//应答
u8 DHT11_Ack(void)
{int flag = 0;while(GPIO_ReadInputDataBit(DHT11_GPIO,DHT11_PIN) == 0){Delay_us(1);flag++;if(flag == 100){return 0;}}flag = 0;while(GPIO_ReadInputDataBit(DHT11_GPIO,DHT11_PIN) == 1){Delay_us(1);flag++;if(flag == 100){return 0;}}return 1;
}//接收应答 5个byte
void DHT11_RcvData(u8 *data)
{int i;DHT11_Reset();if(DHT11_Ack() == 1){for(i = 0; i < 5;i++){data[i] = DHT11_RcvByte();}if(data[4] == data[0] + data[1] + data[2] + data[3] ){printf("湿度是:%u.%u 温度是:%u.%u\\n",data[0],data[1],data[2],data[3]);}else{printf("采集错误\\n");}}
}//接收应答 1个byte
u8 DHT11_RcvByte(void)
{int i;u8 data = 0;for(i = 0;i < 8;i++){data <<= 1;data |= DHT11_RcvBit();}return data;
}//接收应答 1个bit
u8 DHT11_RcvBit(void)
{while(GPIO_ReadInputDataBit(DHT11_GPIO,DHT11_PIN) == SET);if(GPIO_ReadInputDataBit(DHT11_GPIO,DHT11_PIN) == RESET){while(GPIO_ReadInputDataBit(DHT11_GPIO,DHT11_PIN) == RESET);Delay_us(40);if(GPIO_ReadInputDataBit(DHT11_GPIO,DHT11_PIN) == SET){return 1;}else{return 0;}}return 1;
}**
DHTT11.h
#ifndef _DHT11_H_
#define _DHT11_H_
#include "stm32f10x.h"
#include "stm32f10x_conf.h"
#include "delay.h"
#include "usart.h"
//这里我使用的是PD0 GPIOD GPIO_Pin_0
#define DHT11_GPIO GPIOD
#define DHT11_PIN GPIO_Pin_0
#define DHT11_CLOCK RCC_APB2Periph_GPIOD//端口初始化
void DHT11_GPIO_Init(void);//复位
void DHT11_Reset(void);//接收应答 5个byte
void DHT11_RcvData(u8 *data);//接收应答 1个byte
u8 DHT11_RcvByte(void);//接收应答 1个bit
u8 DHT11_RcvBit(void);//应答处理 返回0没收到正确应答,返回1接收到正确应答
u8 DHT11_Ack(void);
#endif
usart.c 和 delay.c我这里不再展示,前面的课程配置过很多次了。
代码运行结果
知识点4【代码所犯错误】
1、在复位的时候,是先拉低18ms以上,写代码途中配置成us。
**2、**在下面代码中,while(GPIO_ReadInputDataBit(DHT11_GPIO,DHT11_PIN) == SET);
忽略掉这个,默认引脚是上拉输入,也会进行数据采集,因此出现了采集错误的现象,这个很难差错,希望大家能够避免这个坑。(重要)
//接收应答 1个bit
u8 DHT11_RcvBit(void)
{while(GPIO_ReadInputDataBit(DHT11_GPIO,DHT11_PIN) == SET);if(GPIO_ReadInputDataBit(DHT11_GPIO,DHT11_PIN) == RESET){while(GPIO_ReadInputDataBit(DHT11_GPIO,DHT11_PIN) == RESET);Delay_us(40);if(GPIO_ReadInputDataBit(DHT11_GPIO,DHT11_PIN) == SET){return 1;}else{return 0;}}return 1;
}
补充拓展
1、使用定时器进行周期性的采样
但是我们知道,在调用TIM_Cmd(TIMx, ENABLE);
的时候,是以下的流程:
- 重新装载预分频器
- 如果 ARR 预装载打开,还会把新 ARR 写入实际计数寄存器
- 同时置位更新中断标志位 UIF
这个过程就说明,触发一次update中断。中断函数中执行的是数据采集工作。
这时候会出现另一个问题
我们上面提过:第一次采集的空闲状态需要至少2s,让我们的传感器完成加热,确保数据采集的正确性。
那么这个第一个中断就势必要关闭
思路
- 先开定时器,不使能更新中断;
- 清除一次 UIF 标志;
- 再使能更新中断并开 NVIC。
代码演示:
// 1. 配置好 TIMx 的时基单元(TIM_TimeBaseInit)……
// 2. 开启时钟、初始化 NVIC 中断优先级(但不使能)// 不开中断,先使能定时器产生一次 UEV 并清掉标志
TIM_Cmd(TIMx, ENABLE);
// 清除可能残留的 UIF 标志
TIM_ClearFlag(TIMx, TIM_FLAG_Update);// 现在再开更新中断
TIM_ITConfig(TIMx, TIM_IT_Update, ENABLE);
NVIC_EnableIRQ(TIMx_IRQn);
主要内容我讲完了,这里实现定时器 定时触发 数据采集中断就很简单了,大家可以当作一个小练习,自己尝试一下。
2、代码健壮性的补充
以我们在void DHT11_Reset(void);
为例
//等待引脚电平被拉低(等待DHT11的应答)
while(GPIO_ReadInputDataBit(DHT11_GPIO,DHT11_PIN));
如果一直是高电平,就会阻塞,会影响程序的正常执行。
因此这里我们可以加入判断
//等待引脚电平被拉低(等待DHT11的应答)int time = 0;while(GPIO_ReadInputDataBit(DHT11_GPIO,DHT11_PIN)){time++;Delay_us(1);if(time < 100){return 0;}}
这样配置即可避免阻塞的情况发生。
结束
代码重在练习!
代码重在练习!
代码重在练习!
今天的分享就到此结束了,希望对你有所帮助,如果你喜欢我的分享,请点赞收藏加关注,谢谢大家!!!
相关文章:
STM32实战指南——DHT11温湿度传感器驱动开发与避坑指南
知识点1【DHT11的概述】 1、概述 DHT是一款温湿度一体化的数字传感器(无需AD转换)。 2、驱动方式 通过单片机等微处理器简单的电路连接就能实时采集本地湿度和温度。DHT11与单片机之间采用单总线进行通信,仅需要一个IO口。 相对于单片机…...
SVG 与 Canvas 技术调研对比
在 画布 中进行 大量矩形框绘制 时,SVG 和 Canvas 都是可行的技术方案,但它们适用于不同的场景,技术特性也有明显区别。下面我从性能、灵活性、可维护性、适用场景等方面做一个系统性的对比,帮助你做出更合适的选择。 ᾞ…...
Ubuntu 远程桌面配置指南
概述: 本文主要介绍在Ubuntu 22.04中通过VNC实现远程连接的方法。首先需安装图形化界面和VNC工具x11vnc,设置开机启动服务;然后在Windows客户端用VNC Viewer通过局域网IP和端口5900连接。 总结: 一、VNC配置与安装 安装图形化界面 在Ubuntu 22.04中需先安装: sudo apt …...
146. LRU 缓存
一、题目 二、思路 题目要求 O(1) 的平均时间复杂度运行 -> 使用Map空间换时间 Map<Integer, Node>Map 通过 key 直接找到对应节点 getNode(key) -> Node记得只要查过该节点之后就应该把该节点放到最前面 pushFront(Node)put 元素后,在map中添加&…...
微信学习之导航功能
先看这个功能的效果: 然后开始学习吧。 一、我们这里用的是vant的Grid控件,首先我们导入: { "usingComponents": {"van-search": "vant/weapp/search/index","my-swiper":"../../components…...
MySQL替换瀚高数据库报错: TO_DAYS()不存在(APP)
文章目录 环境症状问题原因解决方案报错编码 环境 系统平台:中标麒麟(海光)7,中标麒麟(飞腾)7 版本:4.5 症状 MySQL替换为瀚高数据库进行应用系统适配报错:TO_DAYS()不…...
FPGA:高速接口JESD204B以及FPGA实现
本文将先介绍JESD204B高速接口的基本概念和特性,然后详细说明如何基于Xilinx Kintex-7系列FPGA实现JESD204B高速接口。 一、JESD204B高速接口介绍 JESD204B是由JEDEC(固态技术协会)制定的一种高速串行通信标准,主要用于数据转换器…...
HarmonyOS Navigation组件深度解析与应用实践
HarmonyOS Navigation组件深度解析与应用实践 一、组件架构与核心能力 HarmonyOS Navigation组件作为路由导航的根视图容器,采用三层架构设计: 标题层:支持主副标题配置,提供Mini/Free/Full三种显示模式内容层:默认…...
C#中的ThreadStart委托
ThreadStart 委托: ThreadStart 是 .NET 中的一个内置委托类型,表示无参数且无返回值的方法。其定义如下: public delegate void ThreadStart(); 通常用于定义线程的入口方法。 List<ThreadStart>: 这是一个泛型集合&…...
Spring boot 集成 Knife4j
knife4j官网:https://doc.xiaominfo.com/docs/quick-start 1. 引入Knife4j相关依赖 <!-- knife4j--> <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version…...
基于Java在高德地图面查询检索中使用WGS84坐标的一种方法-以某商场的POI数据检索为例
前言 随着移动互联网的飞速发展,基于位置的服务(LBS)需求日益增长,越来越多的应用需要从地图中检索特定区域内的地理信息,例如商业场所、公共服务设施等。商场作为城市商业活动的重要载体,其周边的地理信息…...
6K型护套连接器DLJ0601(2000)-00
6K型护套连接器DLJ0601(2000)-00简介 6K型护套连接器DLJ0601(2000)-00是一种用于电气连接的组件,广泛应用于工业设备、通信系统和电子设备中。该连接器设计紧凑,具有高可靠性和耐用性,适用于多种环境条件下的电气连接需求。 主要特点 高可…...
Hexo的Next主题的Config文件内方便修改的参数(Chat-Gpt)
这是对 Hexo 的 Next 主题 _config.yml 文件各部分配置项的中文解释,帮助你更方便地进行定制: 🚀 核心设置 cache / minify cache.enable: 启用缓存,加快生成速度。minify: 是否压缩生成的 HTML/CSS/JS。 custom_file_path 自…...
【three】给立方体的每个面加载不同贴图
效果图: 主要代码: initCube() {let _this thisconst geometry new Three.BoxGeometry(1, .3, .5)let TextureLoader new Three.TextureLoader()let mater1TextureLoader.load(require(/assets/images/bg2.jpg),function (texture){console.log(tex…...
vscode怎么关闭自动定位文件
关闭自动定位文件功能 方式1 在设置中搜索: explorer.autoReveal 方式2 直接在settings.json中增加"explorer.autoReveal": false 添加类似jetbrains IDE的文件定位功能 可以直接安装插件市场搜索niushuaibing.vs-location, 安装后会有文件定位按钮, 点击后即可…...
2025-5-19Vue3快速上手
1、toRefs和toRef 当解构一个响应式对象(如 reactive 创建的对象)时,直接解构会失去响应性,此时可用 toRefs或toRef 保持响应性 toRef 的核心作用是将对象的属性转换为 ref,保持与原属性的双向绑定,无论原…...
HDMI 屏幕 电脑HDMI HDMI采集卡的关系
一、HDMI接口方向性原理 普通设备的HDMI接口方向: 电脑的HDMI接口:无论是显卡还是主板上的HDMI,均为输出端(信号源),只能向外发送视频信号,无法接收输入信号。 显示器的HDMI接口:均…...
JESD204 ip核使用与例程分析(二)
JESD204 ip核使用与例程分析(二) JESD204时钟方案专用差分时钟对例程分析jesd204_0_transport_layer_demapperjesd204_0_sig_chkjesd204_0_clockingjesd204_0 ip核port寄存器AXI-LITE寄存器配置jesd204_phy ip核JESD204时钟方案 图3-1所示为最通用、灵活的时钟解决方案。在图…...
如何使用VCS+XA加密verilog和spice网表
如果要交付verilog,但是需要对方进行VCS仿真,那么可以用以下方法: 一、基于编译指令的局部加密 适用场景:需精确控制加密范围(如仅加密核心算法或敏感逻辑)。 实现步骤: 代码标注…...
Grafana之Dashboard(仪表盘)
在前面的小节中介绍了Grafana中4中常用的可视化面板的使用,通过在面板中使用PromQL表达式,Grafana能够方便的将Prometheus返回的数据进行可视化展示。例如,在展示主机CPU使用率时,我们使用了如下表达式: 1 - (avg(ira…...
AOSP 中常见的键值对存储方式全解析(适用于系统开发与应用开发)
在 Android 系统开发(AOSP)中,键值对(Key-Value)存储是一种基础且广泛使用的数据持久化方式。从系统属性、用户设置,到应用配置,都依赖于这种结构的存储方式。本文将全面梳理 AOSP 中主流的键值…...
集合进阶2
Java不可变集合、Stream流与方法引用深度解析 一、不可变集合(Immutable Collections)进阶指南 1.1 不可变集合核心特性 防御性编程:防止外部修改数据(如传递集合给第三方库时)线程安全:天然支持多线程读…...
eMMC深度解析:嵌入式多媒体卡的硬件电路设计要点
一、eMMC 技术深度解析 1.定义与背景 eMMC(Embedded Multi Media Card)是一种专为嵌入式系统设计的非易失性存储解决方案,它将 NAND 闪存、主控芯片和接口协议封装在一个 BGA(Ball Grid Array)封装中。其核心目标是简…...
【SPIN】PROMELA语言编程入门同步机制(SPIN学习系列--4)
同步机制 PROMELA 不包含信号量、锁或监控器等常见的同步原语,而是通过语句的**可执行性(executability)**概念来建模同步机制。计算机系统的架构限制了同步机制的设计:本章主要介绍适用于共享内存系统的同步机制,第7…...
整数的个数
【描述】 给定k(1< k < 100)个正整数,其中每个数都是大于等于1,小于等于10的数。写程序计算给定的k个正整数中,1,5和10出现的次数。 【输入】 输入有两行:第一行包含一个正整数kÿ…...
AWS EKS IP 耗尽:原因、解决方案和最佳实践
想象一下,您的 AWS EKS 集群在生产环境中运行顺畅,所有 CI/CD 管道运行正常,服务优雅地扩展,一切都像自动驾驶模式一样。——直到有一天,新的 Pod 无法启动。 您深入研究 kubectl get pods 命令,发现一堆 P…...
艾默生流量计与Profibus DP主站转Modbus RTU/TCP网关通讯案例
艾默生流量计与Profibus DP主站转Modbus RTU/TCP网关通讯案例 在现代工业自动化控制系统中,艾默生流量计因其高精度、稳定性和易用性而备受青睐。然而,为了实现与不同协议设备之间的无缝通信,经常需要借助专业的通讯网关进行协议转换。本文将…...
Python测试单例模式
单例模式的核心思想 单例模式确保一个类只有一个实例,并提供一个全局访问点。这在需要控制资源访问(如配置文件、数据库连接等)时非常有用。 一个简单的示例: import threading import timeclass Singleton:instance Nonelock…...
Linux架构篇、第五章_06Jenkins 触发器全面解析与实战指南
Linux架构篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:jenkins触发器的介绍与使用 版本号: 1.0,0 作者: laowang 日期: 2025.05.16 适用环境:rocky9.5 文档说明 本文档为《jenkins 触发器的介绍与…...
如何快速更换电脑浏览器ip:教程与注意事项
无论是为了访问地域限制内容、保护隐私,还是解决网络问题,快速更换浏览器IP地址的需求日益增多。以下是快速更换电脑浏览器IP地址的几种常用方法及注意事项,结合了多种场景下的解决方案: 一、快速更换浏览器IP的方法 1. 代理服务…...
《黑马前端ajax+node.js+webpack+git教程》(笔记)——ajax教程(axios教程)
黑马程序员前端AJAX入门到实战全套教程,包含学前端框架必会的(ajaxnode.jswebpackgit),一套全覆盖 文章目录 框架前置导学AJAX-Day01-01.AJAX入门与axios使用什么是AJAX如何使用AJAX使用axios获取数据案例axios语法尝试获取数据代…...
超级管理员租户资源初始化与授权管理设计方案
背景说明 在多租户系统中,资源(如功能模块、系统菜单、服务能力等)需按租户维度进行授权管理。超级管理员在创建新租户时,需要初始化该租户的资源授权信息。 两种可选方案 方案描述方案 A:前端传入选中的资源列表创…...
【Python训练营打卡】day30 @浙大疏锦行
DAY 30 模块和库的导入 知识点回顾: 1. 导入官方库的三种手段 2. 导入自定义库/模块的方式 3. 导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何…...
微前端记录
微前端 实习过程中,做了些微前端方向的调研,记录下 微前端将前端拆分为独立的可以单独运行,测试,部署的代码, 具有技术栈无关,多团队,多业务线协作的特点。 前端现有的页面,分为单页…...
词嵌入基础
一 前言 最近在学习NLP方面知识,在此记录一下词嵌入的技术。 二 词袋法 1.理论 就是统计一个句子或文章中,词语出现的次数。这方法有去重词袋法,无去重词袋法。 a 原理与案例 chinese_docs ["我爱自然语言处理","自然语…...
CSS之网页元素的显示与隐藏(旧土豆网遮罩案例)
网页元素的显示与隐藏。 很多网页的侧边栏都会出现广告,我们点击关闭时,广告会消失不见,但若重新刷新网页页面,则广告会重新出现。网页的广告并非是真的被删除了,而是被暂时的隐藏起来了。 • display • visibil…...
关于 Web 漏洞原理与利用:2. XSS(跨站脚本攻击)
一、原理: 用户输入未过滤被执行 攻击者输入的内容,如果没有被正确处理(过滤/转义),被网页原样输出到浏览器中,那么这些内容就可能会被浏览器当成代码执行,这就是 XSS(跨站脚本攻击…...
【TTS回顾】深度剖析 TTS 合成效果的客观评估与主观评价
如何评估合成音色的效果 当我们面对一个新发布的 TTS 模型,或者在多个模型之间进行选择时,一个核心问题摆在我们面前:如何科学、全面地评估一个 TTS 模型的合成效果? 仅仅凭感觉“听一听”显然不够客观和系统。我们需要一套行之有效的评估方法和指标体系,来衡量 AI “说话…...
WPF点击按钮弹出一个窗口
一、基本方法:直接实例化并显示窗口 1. 普通窗口(无参数) 适用场景:简单的弹出窗口,无需传递数据。 private void Button_Click(object sender, RoutedEventArgs e) { var newWindow new MyWindow(); // 实例化…...
WPF中的ObjectDataProvider:用于数据绑定的数据源之一
ObjectDataProvider是WPF(Windows Presentation Foundation)中一种强大而灵活的数据绑定源,它允许我们将对象实例、方法结果甚至是构造函数的返回值用作数据源。通过本文,我将深入探讨ObjectDataProvider的工作原理、使用场景以及如何在实际应用中发挥其…...
Java POJO接收前端null值设置
在 Java 中,若要让 price 字段接收前端传递的 null 值,只需确保以下几点: 1. 使用包装类型 Double 你的 price 字段已经是包装类型 Double(而不是基本类型 double),这天然支持 null 值。基本类型 double …...
C++(24):容器类<list>
目录 一、核心概念 二、基本语法 1. 声明与初始化 2.添加元素 3.访问与遍历 4. 删除元素 三、特点 1. 高效插入/删除 2. 不支持随机访问 3. 特有成员函数 4. 内存与性能 四、示例代码 五、成员函数 六、使用场景 七、注意事项 Lists将元素按顺序储…...
WPF Data Binding 及经典应用示例
什么是Data Binding(数据绑定)? Data Binding是WPF中的核心机制,它建立了UI元素(视图)与数据对象(模型/视图模型)之间的连接通道,实现了数据的自动同步。当数据发生变化…...
Qt—模态与非模态对话框
Qt—模态与非模态对话框 核心概念 模态对话框:强制用户优先处理当前窗口,阻塞指定范围的用户交互。非模态对话框:允许用户自由切换窗口,无交互限制。 一、模态对话框类型与行为 1. 应用级模态(Applica…...
如何实现从网页一键启动你的 Electron 桌面应用(zxjapp://)
在现代桌面应用开发中,Electron 凭借其跨平台能力和前端友好的特性,受到了越来越多开发者的青睐。但你是否想过,如何让用户从网页上一键启动你本地的 Electron 应用?比如像某些云盘客户端那样,点击网页上的按钮就能直接…...
linux编译安装srs
下载编译运行 git clone https://github.com/ossrs/srs.git cd srs/trunk ./configure --h265on make需要安装 yum install -y patch yum install -y unzip yum install -y tcl编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/s…...
对于程序员的个人理解
系统架构师 1.下图是应该具备的能力,而且看前辈的资料中,发现干的时间越多就越全能。 2.对于新技术来说应该让其先沉淀三年左右看他是不是能打,同时可以避免其大规模的改动。 3.要有宏观视野 【要看自己所开发的东西是不是可以随时调用&am…...
Web安全基础
文章目录 前端基础浏览器工作原理HTTP超文本传输协议cookiesessiontoken web服务器USBWebServerNginx介绍 前端三大件html超文本标记语言CSS层叠样式表JavaScript基本语法php基本语法 攻击手段文件上传漏洞文件包含漏洞代码执行漏洞变量修改shell监听SQL注入跨站脚本XSSXSS示例…...
从秒开到丝滑体验!WebAssembly助力ZKmall商城重构 B2B2C 商城性能基线
在 B2B2C 电商领域,用户对页面加载速度与交互流畅度的要求日益严苛。传统 Web 技术在处理复杂业务逻辑、海量数据渲染时,常出现卡顿、延迟等问题,导致用户流失。ZKmall 商城创新性地引入 WebAssembly(简称 Wasm)技术&a…...
word文档交叉引用
参考视频 论文排版中参考文献的引用方法:交叉引用法_哔哩哔哩_bilibili 具体操作 定义编号格式 进入开始页面,重新定义编号格式. 碰到的问题 出现了一个大大的空格,不知道是什么情况,想把编号和参考文献紧贴在一起。 调整列…...