当前位置: 首页 > news >正文

Arduino程序设计(四)按键消抖+按键计数

按键消抖+按键计数

  • 前言
  • 一、按键消抖
  • 二、按键计数
    • 1、示例代码
    • 2、按键计数实验
  • 参考资料


前言

  • 本文主要介绍两种按键控制LED实验:
  • 第一种是采用软件消抖的方法检测按键按下的效果;
  • 第二种是根据按键按下次数,四个LED灯呈现不同的流水灯效果。

一、按键消抖

  • 按键在按下时,由于机械和物理特定的原因,经常会产生一些开关变换,而这些变换会让程序误认为是短时间内进行了多次按键。
  • 如何对输入信号进行消抖?也就是在一段短时间内进行两次检查来确保按键确实被按下。如果没有消抖的话,按下一次按键会产生很多不可预知的结果。
  • 所以Arduino按键消抖是为了解决按键在物理接触瞬间可能产生多次触发的现象。
  • 下面介绍两种常见的按键消抖方法:
  • ① 使用外部电容(硬件消抖):通过在按键引脚和地之间并联一个适当大小的电容(例如:MCU复位电路采用0.1uF陶瓷电容),减少了按键连接和断开时产生的电压突变,同时也可以减少按键在短时间内多次触发的可能性。MCU复位电路如下图所示:
    在这里插入图片描述
  • ② 软件消抖:利用Arduino的延时函数或计时器来检测按键状态的变化,只有在按键状态保持一段时间后才认为按键有效。例如,当检测到按键按下时,可以设定一个延时时间,在延时时间内如果检测到按键保持按下状态,则认为按键有效。

按键消抖实验:

  • 1、本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

  • 2、按键消抖的电路图如下图所示:
    在这里插入图片描述

  • 3、功能实现:按下一个按键,控制LED灯亮50ms然后熄灭。

  • 4、实验要求:采用延时消抖(方法1),编写按键扫描程序(方法2),计数器消抖(方法3)三种按键消抖方式实现功能。

代码实现(方法1):

//延时消抖,按键控制LED
//按下一个按键,控制LED灯亮50ms然后熄灭int buttonPin = 7;
int ledPin = 12;void setup() {pinMode(buttonPin, INPUT_PULLUP);pinMode(ledPin, OUTPUT);}
void loop() {if (digitalRead(buttonPin) == LOW){delay(10);if (digitalRead(buttonPin) == LOW){digitalWrite(ledPin, HIGH);delay(50);digitalWrite(ledPin, LOW);while (digitalRead(buttonPin) == LOW);}}
}

代码实现(方法2):

//编写按键扫描程序,实现按键消抖
//按下一个按键,控制LED灯亮50ms然后熄灭#define LED 12
#define KEY 7int KEY_NUM = 0;                   //按键键值存放变量,不等于1说明有按键按下void setup()
{pinMode(LED, OUTPUT);         //定义LED为输出引脚pinMode(KEY, INPUT_PULLUP);   //定义KEY为带上拉输入引脚
}void loop()
{ScanKey();                   //按键扫描程序,当按键按下时候,该子程序会修改KEY_NUM的值if (KEY_NUM == 1)            //是否按键按下{digitalWrite(LED, HIGH);delay(50);digitalWrite(LED, LOW);}
}void ScanKey()                        //按键扫描程序
{KEY_NUM = 0;                        //清空变量if (digitalRead(KEY) == LOW)        //有按键按下{delay(10);                        //延时去抖动if (digitalRead(KEY) == LOW)      //有按键按下{KEY_NUM = 1;                    //变量设置为1while (digitalRead(KEY) == LOW); //等待按键松手}}
}

代码实现(方法3):

//计数器消抖,按键控制LED
//按下一个按键,控制LED灯亮50ms然后熄灭const int buttonPin = 7;  // 按键引脚
const int ledPin = 12;    //LED引脚int buttonState = HIGH;   // 按键状态
int lastButtonState = HIGH;  // 上一次的按键状态
unsigned long lastDebounceTime = 0;  // 上一次的触发时间
unsigned long debounceDelay = 10;    // 消抖延时void setup() {pinMode(buttonPin, INPUT_PULLUP);pinMode(ledPin,OUTPUT);
}void loop() {int reading = digitalRead(buttonPin);  // 读取按键引脚状态// 如果当前状态与上一次状态不同,更新上一次状态和触发时间if (reading != lastButtonState) {lastDebounceTime = millis();}// 如果经过了消抖延时,且当前状态与按键状态不同,更新按键状态if ((millis() - lastDebounceTime) > debounceDelay) {if (reading != buttonState) {buttonState = reading;// 按键按下时执行的操作if (buttonState == HIGH) {digitalWrite(ledPin, HIGH);delay(50);digitalWrite(ledPin, LOW);}}}lastButtonState = reading;
}

二、按键计数

1、示例代码

  • 使用Arduino来实现按键计数。简单的示例代码如下:
//按键计数示例
const int buttonPin = 2;   // 按钮连接到数字引脚2
int buttonState = 0;       // 保存按钮状态
int count = 0;             // 计数器void setup() {pinMode(buttonPin, INPUT);     // 设置按钮引脚为输入模式Serial.begin(9600);            // 打开串口通信
}void loop() {buttonState = digitalRead(buttonPin);   // 读取按钮状态if (buttonState == HIGH) {    // 如果按钮按下count++;                   // 计数器加1Serial.print("Button pressed. Count: ");Serial.println(count);delay(200);                // 等待200毫秒,避免连续多次计数}
}

示例中,我们将一个按钮连接到Arduino的数字引脚2。循环中,我们读取按钮的状态,如果按钮被按下(高电平),计数器就会加1,并通过串口打印出计数器的值。为了避免按钮按下时的抖动,我们在每次计数后延迟200毫秒。

上传这个代码到Arduino板,然后打开串口监视器(波特率设置为9600),当你按下按钮时,你将看到计数器的值递增。

2、按键计数实验

  • (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。

  • (2)按键计数的电路图如下图所示:
    在这里插入图片描述

  • (3)实现功能(基础):

  • ① 第一次按下按键,LED1点亮;

  • ② 第二次按下按键,LED1和LED2点亮;

  • ③ 第三次按下按键,LED1~LED3点亮;

  • ④ 第四次按下按键,LED1~LED4点亮;

  • ⑤ 第五次按下按键,LED1~LED4熄灭;

  • ⑥ 第六次按下按键,重复①现象;

  • ⑦ 第七次按下按键,重复②现象……,以此类推。

代码实现:

//编写按键扫描程序,实现按键计数
/*实验现象:
① 第一次按下按键,LED1点亮;
② 第二次按下按键,LED1和LED2点亮;
③ 第三次按下按键,LED1~LED3点亮;
④ 第四次按下按键,LED1~LED4点亮;
⑤ 第五次按下按键,LED1~LED4熄灭;
⑥ 第六次按下按键,重复①现象;
⑦ 第七次按下按键,重复②现象……,以此类推。
*/const int KEY = 7;      //按键引脚
const int LED1 = 9;     //LED1引脚
const int LED2 = 10;    //LED2引脚
const int LED3 = 11;    //LED3引脚
const int LED4 = 12;    //LED4引脚int KEY_count = 0;      //按键计数void setup()
{pinMode(KEY, INPUT_PULLUP);    //定义KEY为带上拉输入引脚pinMode(LED1, OUTPUT);         //定义LED1为输出引脚pinMode(LED2, OUTPUT);         //定义LED2为输出引脚pinMode(LED3, OUTPUT);         //定义LED3为输出引脚pinMode(LED4, OUTPUT);         //定义LED4为输出引脚
}void loop()
{ScanKey();                   //按键扫描程序,当按键按下时候,该子程序会修改KEY_count的值switch (KEY_count) {case 0:{digitalWrite(LED1, LOW);digitalWrite(LED2, LOW);digitalWrite(LED3, LOW);digitalWrite(LED4, LOW);}break;case 1:{digitalWrite(LED1, HIGH);}break;case 2:{digitalWrite(LED1, HIGH);digitalWrite(LED2, HIGH);}break;case 3:{digitalWrite(LED1, HIGH);digitalWrite(LED2, HIGH);digitalWrite(LED3, HIGH);}break;case 4:{digitalWrite(LED1, HIGH);digitalWrite(LED2, HIGH);digitalWrite(LED3, HIGH);digitalWrite(LED4, HIGH);}break;default:{KEY_count = 0;}}
}void ScanKey()                        //按键扫描程序
{if (digitalRead(KEY) == LOW)        //有按键按下{delay(10);                        //延时去抖动if (digitalRead(KEY) == LOW)      //有按键按下{KEY_count++;                   //按键计数while (digitalRead(KEY) == LOW); //等待按键松手}}
}
  • (4)实现功能(进阶):
  • ① 第一次按下按键,LED1和LED3亮500ms后熄灭,间隔150ms后,LED2和LED4亮150ms后熄灭,间隔150ms后,LED1和LED3亮150ms后熄灭……,重复操作。
  • ② 第二次按下按键,LED1~LED4从左往右依次点亮,等LED4熄灭后,再从左往右依次点亮,重复操作,相邻两个LED灯亮灭的时间间隔为50ms。
  • ③ 第三次按下按键,LED1~LED4从右往左依次点亮,等LED1熄灭后,再从右往左依次点亮,重复操作,相邻两个LED灯亮灭的时间间隔为50ms。
  • ④ 第四次按下按键,LED1~LED4从左往右依次点亮,再从右往左依次点亮,重复操作,相邻两个LED灯亮灭的时间间隔为50ms。
  • ⑤ 第五次按下按键,LED1~LED4熄灭。
  • ⑥ 第六次按下按键,重复①现象
  • ⑦ 第七次按下按键,重复②现象……,以此类推。

代码实现:

//编写按键扫描程序,实现按键计数
//注意:按下按键后,即下一次按下按键前,时间间隔>10s
/*实验现象:① 第一次按下按键,LED1和LED3亮150ms后熄灭,间隔150ms后,LED2和LED4亮150ms后熄灭,间隔150ms后,LED1和LED3亮150ms后熄灭……,重复操作。② 第二次按下按键,LED1~LED4从左往右依次点亮,等LED4熄灭后,再从左往右依次点亮,重复操作,相邻两个LED灯亮灭的时间间隔为50ms。③ 第三次按下按键,LED1~LED4从右往左依次点亮,等LED1熄灭后,再从右往左依次点亮,重复操作,相邻两个LED灯亮灭的时间间隔为50ms。④ 第四次按下按键,LED1~LED4从左往右依次点亮,再从右往左依次点亮,重复操作,相邻两个LED灯亮灭的时间间隔为50ms。⑤ 第五次按下按键,LED1~LED4熄灭。⑥ 第六次按下按键,重复①现象⑦ 第七次按下按键,重复②现象……,以此类推。
*/const int KEY = 7;      //按键引脚
const int LED1 = 9;     //LED1引脚
const int LED2 = 10;    //LED2引脚
const int LED3 = 11;    //LED3引脚
const int LED4 = 12;    //LED4引脚int KEY_count = 0;      //按键计数void setup()
{pinMode(KEY, INPUT_PULLUP);    //定义KEY为带上拉输入引脚pinMode(LED1, OUTPUT);         //定义LED1为输出引脚pinMode(LED2, OUTPUT);         //定义LED2为输出引脚pinMode(LED3, OUTPUT);         //定义LED3为输出引脚pinMode(LED4, OUTPUT);         //定义LED4为输出引脚
}void loop()
{ScanKey();                   //按键扫描程序,当按键按下时候,该子程序会修改KEY_count的值switch (KEY_count) {case 0:{digitalWrite(LED1, LOW);digitalWrite(LED2, LOW);digitalWrite(LED3, LOW);digitalWrite(LED4, LOW);}break;case 1:{//第一次按下按键digitalWrite(LED1, HIGH);digitalWrite(LED2, LOW);digitalWrite(LED3, HIGH);digitalWrite(LED4, LOW);delay(150);digitalWrite(LED1, !digitalRead(LED1));digitalWrite(LED2, !digitalRead(LED2));digitalWrite(LED3, !digitalRead(LED3));digitalWrite(LED4, !digitalRead(LED4));delay(150);}break;case 2:{//刷新LED1~LED4状态digitalWrite(LED1, LOW);digitalWrite(LED2, LOW);digitalWrite(LED3, LOW);digitalWrite(LED4, LOW);//第二次按下按键digitalWrite(LED1, HIGH);delay(50);digitalWrite(LED1, !digitalRead(LED1));digitalWrite(LED2, HIGH);delay(50);digitalWrite(LED2, !digitalRead(LED2));digitalWrite(LED3, HIGH);delay(50);digitalWrite(LED3, !digitalRead(LED3));digitalWrite(LED4, HIGH);delay(50);digitalWrite(LED4, !digitalRead(LED4));delay(50);}break;case 3:{//刷新LED1~LED4状态digitalWrite(LED1, LOW);digitalWrite(LED2, LOW);digitalWrite(LED3, LOW);digitalWrite(LED4, LOW);//第三次按下按键digitalWrite(LED4, HIGH);delay(50);digitalWrite(LED4, !digitalRead(LED4));digitalWrite(LED3, HIGH);delay(50);digitalWrite(LED3, !digitalRead(LED3));digitalWrite(LED2, HIGH);delay(50);digitalWrite(LED2, !digitalRead(LED2));digitalWrite(LED1, HIGH);delay(50);digitalWrite(LED1, !digitalRead(LED1));delay(50);}break;case 4:{//刷新LED1~LED4状态digitalWrite(LED1, LOW);digitalWrite(LED2, LOW);digitalWrite(LED3, LOW);digitalWrite(LED4, LOW);//第四次按下按键digitalWrite(LED1, HIGH);delay(50);digitalWrite(LED1, !digitalRead(LED1));digitalWrite(LED2, HIGH);delay(50);digitalWrite(LED2, !digitalRead(LED2));digitalWrite(LED3, HIGH);delay(50);digitalWrite(LED3, !digitalRead(LED3));digitalWrite(LED4, HIGH);delay(50);digitalWrite(LED4, !digitalRead(LED4));delay(50);digitalWrite(LED4, HIGH);delay(50);digitalWrite(LED4, !digitalRead(LED4));digitalWrite(LED3, HIGH);delay(50);digitalWrite(LED3, !digitalRead(LED3));digitalWrite(LED2, HIGH);delay(50);digitalWrite(LED2, !digitalRead(LED2));digitalWrite(LED1, HIGH);delay(50);digitalWrite(LED1, !digitalRead(LED1));delay(50);}break;default:{digitalWrite(LED1, LOW);digitalWrite(LED2, LOW);digitalWrite(LED3, LOW);digitalWrite(LED4, LOW);KEY_count = 0;}}
}void ScanKey()                        //按键扫描程序
{if (digitalRead(KEY) == LOW)        //有按键按下{delay(10);                        //延时去抖动if (digitalRead(KEY) == LOW)      //有按键按下{KEY_count++;                   //按键计数while (digitalRead(KEY) == LOW); //等待按键松手}}
}

注意:按下按键后,即下一次按下按键前,时间间隔>10s。


参考资料

参考资料1: 【Arduino官方教程】数字处理示例(三):按键防抖
参考资料2: 【Arduino官方教程】数字处理示例(五):按键状态变化检测

相关文章:

Arduino程序设计(四)按键消抖+按键计数

按键消抖按键计数 前言一、按键消抖二、按键计数1、示例代码2、按键计数实验 参考资料 前言 本文主要介绍两种按键控制LED实验:第一种是采用软件消抖的方法检测按键按下的效果;第二种是根据按键按下次数,四个LED灯呈现不同的流水灯效果。 一…...

Scrum Guide Chinese Simplified.pdf

敏捷指南...

Module not found: Error: Can‘t resolve ‘vue-pdf‘ in ‘xxx‘

使用命令npm run serve时vue项目报错: Module not found: Error: Cant resolve vue-pdf in xxx 解决方案: 运行命令: npm install vue-pdf --save --legacy-peer-deps 即可解决。 再次顺利执行npm run serve...

ELK之LogStash介绍及安装配置

一、logstash简介 集中、转换和存储数据 Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。 Logstash 能够动态地采集、转换和传输数据,不受格式或复杂度的…...

docker学习(1)

1、容器与虚拟机的对比: 虚拟机(virtual machine)就是带环境安装的一种解决方案。 它可以在一种操作系统里面运行另一种操作系统,比如在Windows10系统里面运行Linux系统CentOS7。 应用程序对此毫无感知,因为虚拟机看…...

UE5 Niagara基础知识讲解

文章目录 前言官方文档发射器生成(Emitter Spawn)发射器更新(Emitter Update)Spawn Rate(生成速率)粒子生成(Particle Spawn)Initialize Particle(初始化粒子)粒子生命周期粒子颜色粒子大小Shape Location(形状位置)形状位置Add Velocity(添加速度)粒子速度Curl …...

缓存穿透、缓存击穿和缓存雪崩

👏作者简介:大家好,我是爱发博客的嗯哼,爱好Java的小菜鸟 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦 📝社区论坛:希望大家能加入社区共同进步…...

自动化编排工具Terraform介绍(一)

Terraform是什么?: Terraform 是 HashiCorp 公司旗下的 Provision Infrastructure 产品, 是 AWS APN Technology Partner 与 AWS DevOps Competency Partner。Terraform 是一个 IT 基础架构自动化编排工具,它的口号是“Write, Plan, and Create …...

zhm_real/MotionPlanning运动规划库中A*算法源码详细解读

本文主要对zhm_real/MotionPlanning运动规划库中A*算法源码进行详细解读,即对astar.py文件中的内容进行详细的解读,另外本文是 Hybrid A * 算法源码解读的前置文章,为后续解读Hybrid A * 算法源码做铺垫。 astar.py文件中的源码如下&#xff…...

SpringMVC中Controller层获取前端请求参数的几种方式

SpringMVC中Controller层获取前端请求参数的几种方式 1、SpringMVC自动绑定2、使用RequestParam 注解进行接收3、RequestBody注解(1) 使用实体来接收JSON(2)使用 Map 集合接收JSON(3) 使用 List集合接收JSO…...

记Flask-Migrate迁移数据库失败的两个Bug——详解循环导入问题

文章目录 Flask-Migrate迁移数据库失败的两个Bug1、找不到数据库:Unknown database ***2、迁移后没有效果:No changes in schema detected. Flask-Migrate迁移数据库失败的两个Bug 1、找不到数据库:Unknown database ‘***’ 若还没有创建数…...

在线求助。。npm i 报错,连公司内部网,无法连外网

各位前端朋友 ,有没有遇到我这种npm i 报错的问题。 公司内网,无法连外网,使用公司内部的Nexus镜像源 我在公司内网执行npm i 报错,报network连接失败。 我都已经在npm设置了内部镜像源,它为啥还要去外网下载呢。而…...

TCP/UDP/IP协议简介

IP协议简介 特指为实现一个相互连接的网络系统上从源地址到目的地址传输数据包(互联网数据包) 所提供必要功能的协议 特点: 不可靠:不能保证IP数据包能够成功的到达它的目的地只能提供尽力而为的传输服务。 无连接:IP并不维护任何关于后续数…...

写点感想3:关于本人近期的说明与一点感受

按照我今年以来7月之前的更新频率,我已经好久没有更新博文了(或者说静下来写点东西)。 我其实有规划蛮多的有意思的且想要去研究下的topic,最近好久没能更新主要的原因包括: 开启了我职业生涯的第二份工作:在某研究院工作2年零3…...

opencv-全景图像拼接

运行环境 python3.6 opencv 3.4.1.15 stitcher.py import numpy as np import cv2class Stitcher:#拼接函数def stitch(self, images, ratio0.75, reprojThresh4.0,showMatchesFalse):#获取输入图片(imageB, imageA) images#检测A、B图片的SIFT关键特征点,并计算…...

如何将下载的安装包导入PyCharm

1. 下载安装包 这里以pyke为例。下载好之后解压缩,然后放入/Lib/site-packages/pyke-1.1.1 2. 打开PyCharm的终端进行安装 python setup.py install 3. 安装好之后导入即可使用 import pyke...

【redis问题】Caused by: io.netty.channel

遇到的问题: 在使用 RedisTemplate 连接 Redis 进行操作的时候,发生了如下报错: 测试代码为: 配置文件: 问题根源: redis没有添加端口映射解决方案: 删除原来的redis容器,添加新…...

Elasticsearch 处理地理信息

1、GeoHash ​ GeoHash是一种地理坐标编码系统,可以将地理位置按照一定的规则转换为字符串,以方便对地理位置信息建立空间索引。首先要明确的是,GeoHash代表的不是一个点而是一个区域。GeoHash具有两个显著的特点:一是通过改变 G…...

ARM开发,stm32mp157a-A7核IIC实验(采集温湿度传感器值)

1.实验目标:采集温湿度传感器值; 2.分析框图(模拟IIC控制器); 3.代码; ---iic.h封装时序协议头文件--- #ifndef __IIC_H__ #define __IIC_H__ #include "stm32mp1xx_gpio.h" #include "st…...

021-从零搭建微服务-短信服务(一)

写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue 源码地址(前端):https://gitee.com/csps…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...