EPS32基础篇开发
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
开发 EPS32基础篇
- 前言
- 一、GPIO输入输出
- GPIO可设置一下4种状态
- 代码示例:检测按键,按下时:LED亮,松开时,LED灭
- 二、PWM输出
- 示例代码:呼吸灯
- 三、外部中断
- 中断触发模式列举:attachInterrupt();函数
- 代码示例:下降沿检测,计数
- 四、ADC
- 代码示例:ADC检测
- 五、定时器
- 代码示例:定时器
- 六、DHT11
- 代码示例:250ms读取一次温湿度
- 七、u8g2驱动SSD1306 屏幕
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、GPIO输入输出
- 输入模式 (INPUT):当将 pinMode(pin, INPUT)
设置为输入模式时,该引脚允许从外部电路读取电平信号(高或低),例如连接到按钮、传感器等。 - 输出模式 (OUTPUT):通过 pinMode(pin,
OUTPUT),你可以控制这个引脚作为通用的输出口,可以驱动LED或其他电子元件。 - 模拟输入模式 (ANALOGIN):如果你想要将该引脚作为一个ADC(模拟数字转换器)使用,获取电压值而不是简单的二进制状态,可以使用
pinMode(pin, ANALOGIN)。
GPIO可设置一下4种状态
// 设置引脚2为输入模式
pinMode(2, INPUT);// 设置引脚3为输出模式
pinMode(3, OUTPUT);// 设置引脚4为输入上拉模式(假设Arduino板支持)
pinMode(4, INPUT_PULLUP);
// 设置引脚4为输入下拉模式(假设Arduino板支持)
pinMode(4, INPUT_PULLDOWN);
代码示例:检测按键,按下时:LED亮,松开时,LED灭
const int buttonPin = 2; // 定义按键连接的引脚
int ledPin = 13; // LED灯连接的引脚void setup() {// 初始化串口通信,以便在串口监视器中查看输出Serial.begin(9600);// 设置按键引脚为输入模式pinMode(buttonPin, INPUT_PULLUP);// 设置LED引脚为输出模式pinMode(ledPin, OUTPUT);
}void loop() {// 读取按键状态int buttonState = digitalRead(buttonPin);// 在串口监视器中输出按键状态if (buttonState == HIGH) {Serial.println("Button is NOT pressed");digitalWrite(ledPin, LOW); // 熄灭LED灯} else {Serial.println("Button is pressed");digitalWrite(ledPin, HIGH); // 点亮LED灯}// 为了避免串口输出过快,添加一个小延迟delay(100);
}
二、PWM输出
基本概念和工作原理
PWM(脉宽调制)是一种用于控制电子设备亮度、音量等特性的技术。在Arduino ESP32中,PWM输出功能用于控制LED灯的亮度,或者驱动电机等。它通过在一定时间内改变高电平(通电)和低电平(断电)的时间比例,来控制设备的亮度或工作状态。
- 初始化PWM通道
-------初始化PWM通道包括选择通道和设置相关参数。使用ledcSetup()函数来设置PWM通道的频率和分辨率。例如,要设置LEDC通道0的频率为1000Hz,分辨率为8位,可以调用ledcSetup(0, 1000, 8);。(有两种分辨率设置8位和10位) - 绑定PWM通道到具体引脚
------将初始化后的PWM通道绑定到具体的GPIO引脚,需要使用ledcAttachPin()函数。该函数接受两个参数:要绑定的引脚编号和PWM通道编号。例如,要将引脚2绑定到LEDC通道0,可以调用ledcAttachPin(2, 0);。 - 设置PWM的占空比
------设置PWM的占空比,可以使用ledcWrite()函数。该函数接受两个参数:PWM通道的编号和要设置的占空比数值。例如,要将LEDC通道0的占空比设置为50%,可以调用ledcWrite(0, 128);,因为8位分辨率的PWM信号的占空比取值范围为0到255,所以128代表50%的占空比。
easeInOutQuad函数 是一种非常有用的缓动函数,它可以在多种应用场景中产生平滑、自然的动画效果;
示例代码:呼吸灯
#define LED_PIN 14 // LED连接的引脚
#define LEDC_CHANNEL 0 // PWM通道
#define LEDC_FREQ 1000 // PWM频率
#define LEDC_RESOLUTION 8 // 分辨率// 缓动函数
float easeInOutQuad(float t) {if (t < 0.5) return 2 * t * t;else return -1 + (4 - 2 * t) * t;
}void setup() {// 初始化PWM通道ledcSetup(LEDC_CHANNEL, LEDC_FREQ, LEDC_RESOLUTION);// 将LED引脚绑定到PWM通道ledcAttachPin(LED_PIN, LEDC_CHANNEL);
}void loop() {// LED亮度渐增for (int i = 0; i <= 255; i++) {float t = i / 255.0;int dutyCycle = easeInOutQuad(t) * 255;ledcWrite(LEDC_CHANNEL, dutyCycle); // 设置PWM的占空比delay(10); // 延时10毫秒(根据需要调整)}// LED亮度渐减for (int i = 255; i >= 0; i--) {float t = i / 255.0;int dutyCycle = easeInOutQuad(t) * 255;ledcWrite(LEDC_CHANNEL, dutyCycle); // 设置PWM的占空比delay(10); // 延时10毫秒(根据需要调整)}
}
三、外部中断
ESP32的所有GPIO引脚(除了34-39之外)都可以被配置为中断引脚。
中断触发模式列举:attachInterrupt();函数
- CHANGE:当外部中断引脚的电平发生变化时触发中断,无论是从低到高还是从高到低。
- RISING:当外部中断引脚从低电平变为高电平时触发中断。上升沿
- FALLING:当外部中断引脚从高电平变为低电平时触发中断。下降沿
- ONLOW:当外部中断引脚处于低电平时触发中断。
- ONHIGH:当外部中断引脚处于高电平时触发中断。
代码示例:下降沿检测,计数
// 定义外部中断引脚
#define INTERRUPTION_PIN 14
// 定义用于计数的变量
volatile int count = 0;// 中断服务程序
void IRAM_ATTR handleInterrupt() {// 增加计数count++;
}void setup() {// 初始化串口通信,用于调试Serial.begin(115200);// 配置外部中断引脚为输入模式pinMode(INTERRUPTION_PIN, INPUT_PULLUP);// 确保在attachInterrupt之前,引脚4处于高电平状态digitalWrite(INTERRUPTION_PIN, HIGH);delay(1); // 短暂延时,确保引脚状态稳定// 附加中断服务程序到外部中断引脚attachInterrupt(digitalPinToInterrupt(INTERRUPTION_PIN), handleInterrupt, FALLING);// 输出初始计数Serial.println("Initial count: " + String(count));
}void loop() {// 延时一段时间,然后输出当前计数delay(1000);Serial.println("Current count: " + String(count));
}
四、ADC
使用注意事项:
ESP32的ADC驱动程序API支持ADC1和ADC2。
ADC1有8个通道,连接到GPIO 32-39。
ADC2有10个通道,连接到GPIO 0, 2, 4, 12-15和25-27。但请注意,ADC2与Wi-Fi模块共享资源,因此在使用ADC2时需要注意Wi-Fi状态。
高精度:采用12位分辨率,可以提供较为精确的转换结果。
多通道支持:支持18个模拟输入管脚,满足多种应用场景的需求。
低功耗:部分控制器支持Deep-sleep模式下的低功耗运行。
灵活配置:可配置多种分辨率(如12位、11位、10位、9位)
代码示例:ADC检测
#include <Arduino.h>const int analogPin = 35; // 定义模拟输入引脚void setup() {Serial.begin(9600); // 初始化串口通信pinMode(analogPin, INPUT); // 设置模拟输入引脚为输入模式analogReadResolution(12); // 设置ADC分辨率为13位analogSetAttenuation(ADC_11db); // 设置ADC衰减倍数为11dB
}void loop() {int sensorValue = analogRead(analogPin); // 读取模拟输入值Serial.println(sensorValue); // 打印读取的ADC值delay(1000); // 延迟1秒
}
五、定时器
代码示例:定时器
#define LED_PIN 12 // GPIO2,通常内建LED在ESP32上// 创建定时器句柄
hw_timer_t * timer = NULL;// 定义一个标志位用于指示是否要处理定时器事件
volatile bool timerFlag = false;void IRAM_ATTR onTimer() {// 这是定时器中断服务程序 (ISR)timerFlag = true;
}void setup() {Serial.begin(115200);pinMode(LED_PIN, OUTPUT); // 设置LED引脚为输出模式digitalWrite(LED_PIN, LOW); // 初始状态关闭LED// 设置定时器timer = timerBegin(0, 80, true); // 分频因子80意味着定时器计数频率为20MHz/80=250kHztimerAttachInterrupt(timer, &onTimer, true); // 将ISR关联到定时器timerAlarmWrite(timer, 250000, true); // 每250000微秒(即每秒)产生一次中断timerAlarmEnable(timer); // 启用定时器报警
}void loop() {if (timerFlag) {// 处理定时器事件static bool ledState = false;ledState = !ledState; // 反转LED状态digitalWrite(LED_PIN, ledState);Serial.println("Timer triggered!");timerFlag = false; // 重置标志位}
}
六、DHT11
代码示例:250ms读取一次温湿度
#include "DHT.h" // 包含DHT库#define LED_PIN 14 // GPIO12,通常内建LED在ESP32上
#define DHTPIN 4 // DHT11连接到GPIO4
#define DHTTYPE DHT11 // 使用DHT 11// 创建定时器句柄
hw_timer_t * timer = NULL;// 定义一个标志位用于指示是否要处理定时器事件
volatile bool timerFlag = false;// 创建DHT对象
DHT dht(DHTPIN, DHTTYPE);void IRAM_ATTR onTimer() {// 这是定时器中断服务程序 (ISR)timerFlag = true;
}void setup() {Serial.begin(115200);pinMode(LED_PIN, OUTPUT); // 设置LED引脚为输出模式digitalWrite(LED_PIN, LOW); // 初始状态关闭LED// 初始化DHT传感器dht.begin();// 设置定时器timer = timerBegin(0, 80, true); // 分频因子80意味着定时器计数频率为20MHz/80=250kHztimerAttachInterrupt(timer, &onTimer, true); // 将ISR关联到定时器timerAlarmWrite(timer, 250000, true); // 每250000微秒(即每秒)产生一次中断timerAlarmEnable(timer); // 启用定时器报警
}void loop() {if (timerFlag) {// 处理定时器事件static bool ledState = false;ledState = !ledState; // 反转LED状态digitalWrite(LED_PIN, ledState);// 读取温度和湿度float humidity = dht.readHumidity();float temperature = dht.readTemperature();// 检查是否成功读取if (isnan(humidity) || isnan(temperature)) {Serial.println("Failed to read from DHT sensor!");} else {// 打印结果Serial.print("Humidity: ");Serial.print(humidity);Serial.print("% Temperature: ");Serial.print(temperature);Serial.println("°C");}Serial.println("Timer triggered!");timerFlag = false; // 重置标志位}
}
实验现象
七、u8g2驱动SSD1306 屏幕
#include <Wire.h>
#include <U8g2lib.h>
#include "DHT.h"// DHT传感器配置
#define DHTPIN 4 // DHT11连接到GPIO4
#define DHTTYPE DHT11 // 使用DHT 11
// 定义OLED的宽度和高度
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64// 定义I2C地址和引脚
#define OLED_SDA_PIN 21
#define OLED_SCL_PIN 22
#define OLED_I2C_ADDRESS 0x3C // SSD1306 I2C 地址,默认为0x3C或0x3D// 创建对象
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ OLED_SCL_PIN, /* data=*/ OLED_SDA_PIN, /* reset=*/ U8X8_PIN_NONE);DHT dht(DHTPIN, DHTTYPE);// 创建定时器句柄
hw_timer_t * timer = NULL;
bool timerFlag500ms = false;
void IRAM_ATTR onTimer() {// 这是定时器中断服务程序 (ISR)timerFlag500ms = true;
}
//函数声明
void DISPLAY_Refresh();void setup() {Serial.begin(115200);// 初始化U8g2库u8g2.begin();u8g2.enableUTF8Print(); // 启用UTF-8支持// 初始化DHT传感器dht.begin();// 设置默认字体大小u8g2.setFont(u8g2_font_wqy12_t_gb2312); // 使用支持中文的字体// 设置定时器timer = timerBegin(0, 80, true); // 分频因子80意味着定时器计数频率为20MHz/80=250kHztimerAttachInterrupt(timer, &onTimer, true); // 将ISR关联到定时器timerAlarmWrite(timer, 50000, true); // 每250000微秒(即每秒)产生一次中断timerAlarmEnable(timer); // 启用定时器报警
}void loop() {if( timerFlag500ms == true){timerFlag500ms = false;DISPLAY_Refresh();}
}
//刷新屏幕显示
void DISPLAY_Refresh()
{// 处理定时器事件// 读取温度和湿度float humidity = dht.readHumidity();float temperature = dht.readTemperature();// 清除屏幕缓冲区u8g2.clearBuffer();// 设置光标位置并打印中文字符u8g2.setCursor(0, 20);u8g2.print("温度:"); // 中文文本u8g2.setCursor(30, 20);u8g2.print( temperature);u8g2.print("℃");u8g2.setCursor(0, 40);u8g2.print("湿度:"); // 中文文本u8g2.setCursor(30, 40);u8g2.print( humidity);u8g2.print("%");// 设置光标位置并打印英文字符u8g2.setCursor(0, 60);u8g2.print("Hello, World!");// 将缓冲区内容发送到显示屏u8g2.sendBuffer();
}
相关文章:
EPS32基础篇开发
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 开发 EPS32基础篇 前言一、GPIO输入输出GPIO可设置一下4种状态代码示例:检测按键,按下时:LED亮,松开时,LED灭 二、…...
【时时三省】(C语言基础)常见的动态内存错误2
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 对非动态开辟空间内存使用free释放 示例: 这个arr数组是在栈上的 *p指向的就是arr 对非动态空间也用了free ferr只能在动态开辟空间使用 使用free释放一块动态开辟空间的一部分…...
Harmony OS开发-ArkUI框架速成四
程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java相关开发、鸿蒙开发、人工智能等,专注于程序员搞钱那点儿事,希望在搞钱的路上有你相伴!君志所向,一往无前! 1.图标库 1.1 图标库概述 HarmonyOS 图标库为 HarmonyOS 开发者提供丰富的在线图…...
vulnhub Earth靶机
搭建靶机直接拖进来就行 1.扫描靶机IP arp-scan -l 2.信息收集 nmap -sS -A -T4 192.168.47.132 得到两个DNS; 在443端口处会让我们加https dirb https://earth.local/ dirb https://terratest.earth.local/ #页面下有三行数值 37090b59030f11060b0a1b4e0000000000004312170a…...
ScheduledExecutorService详解
ScheduledExecutorService 是 Java 并发工具包 (java.util.concurrent) 中的一个接口,用于在指定的延迟后执行任务,或者以固定的时间间隔周期性执行任务。它是 ExecutorService 的子接口,提供了更强大的调度功能。 ScheduledExecutorService…...
logback日志文件多环境配置路径
项目中遇到问题,springboot项目 本地jar包部署到现场后,经常遇到现场的日志存放的路径会更改,经过查阅,有两种方式,下面简单说明一下。 一、第一种 启动jar包时 添加参数 --logging.configF:\hgtest\config\logback.x…...
判断一个变量是否为NaN
1. JS代码 NaN(不是一个数字,但数据类型为number)是执行数学运算没有成功,返回失败的结果。 另外,NaN 不等于 NaN 。 //利用 NaN 是唯一一个不等于自身的特点 function _isNaN(val) {if (val ! val) {return true;}ret…...
Flask 快速入门
1. Flask 简介 1.1 什么是 Flask Flask 是一个用 Python 编写的轻量级 Web 框架,被誉为 微框架。它提供基础功能,如路由、请求处理和模板引擎,但不强迫开发者使用特定库或工具,赋予开发人员高度的自由选择权,以满足不…...
性能测试03|JMeter:断言、关联、web脚本录制
目录 一、断言 1、响应断言 2、json断言 3、持续时间断言 二、关联 1、正则表达式介绍 2、正则表达式提取器 3、Xpath提取器 4、JSON提取器 5、JMeter属性 三、web脚本录制 一、断言 定义:让程序自动判断实际的返回结果是否与预期结果保持一致 自动校验…...
微信小程序调用 WebAssembly 烹饪指南
我们都是在夜里崩溃过的俗人,所幸终会天亮。明天就是新的开始,我们会变得与昨天不同。 一、Rust 导出 wasm 参考 wasm-bindgen 官方指南 https://wasm.rust-lang.net.cn/wasm-bindgen/introduction.html wasm-bindgen,这是一个 Rust 库和 CLI…...
java_配置使用nacos完整示例
参考:49 尚上优选项目-平台管理端-整合ESMQ实现商品上下架-流程分析_哔哩哔哩_bilibili 1. 下载安装nacos https://github.com/alibaba/nacos/releases 2. 解压,运行 PS D:\path/to\nacos-server-2.4.3\nacos\bin> .\startup.cmd -m standalone 3.…...
Go语言性能优化-字符串格式化优化
在 Go 语言中,格式化字符串(例如使用 fmt.Sprintf、fmt.Printf 等函数)确实可能对性能产生影响,尤其是当频繁执行格式化操作时。格式化字符串涉及对格式符的解析和数据类型的转换,这会增加额外的开销。为了减少格式化字符串带来的性能影响,可以采取以下一些优化策略: 1…...
Spring源码分析之事件机制——观察者模式(二)
目录 获取监听器的入口方法 实际检索监听器的核心方法 监听器类型检查方法 监听器的注册过程 监听器的存储结构 过程总结 Spring源码分析之事件机制——观察者模式(一)-CSDN博客 Spring源码分析之事件机制——观察者模式(二ÿ…...
机器学习和深度学习
机器学习(Machine Learning,简称 ML)和深度学习(Deep Learning,简称 DL)都是人工智能(AI)领域的重要技术,它们的目标是使计算机通过数据学习和自主改进,从而完…...
MetaGPT - 多Agent框架
文章目录 一、关于 MetaGPT功能介绍快速开始的演示视频教程 二、安装Pip安装Docker安装 一、关于 MetaGPT MetaGPT 为GPTs分配不同的角色,以形成一个协作实体来完成复杂的任务。 github : https://github.com/geekan/MetaGPTtwitter : https://twitter.com/MetaGP…...
Hyperbolic dynamics
http://www.scholarpedia.org/article/Hyperbolic_dynamics#:~:textAmong%20smooth%20dynamical%20systems%2C%20hyperbolic%20dynamics%20is%20characterized,semilocal%20or%20even%20global%20information%20about%20the%20dynamics. 什么是双曲动力系统? A hy…...
TIM的输入捕获
IC(Input Capture)输入捕获 输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中 我们使用测周法测频率 void IC_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphCl…...
SCAU期末笔记 - 数据库系统概念往年试卷解析
数据库搞得人一头雾水,题型太多太杂,已经准备摆烂了。就刷刷往年试卷,挂不挂听天由命。 2019年 Question 1 选择题 1. R ∩ S R∩S R∩S等于一下哪个选项? 画个文氏图秒了 所以选A. R ∩ S R − ( R − S ) R∩SR-(R-S) R∩…...
黑马跟学.苍穹外卖.Day01
黑马跟学.苍穹外卖.Day01 苍穹外卖-day01课程内容1. 软件开发整体介绍1.1 软件开发流程1.2 角色分工1.3 软件环境 2. 苍穹外卖项目介绍2.1 项目介绍2.2 产品原型2.3 技术选型 3. 开发环境搭建3.1 前端环境搭建3.2 后端环境搭建3.2.1 熟悉项目结构3.2.2 Git版本控制3.2.3 数据库…...
获取系统启动时间
获取系统启动时间 uptime命令 gbgb:~$ uptime09:29:41 up 2:21, 4 users, load average: 0.00, 0.00, 0.00 gbgb:~$ 这里的up 13 min表示系统已经运行了2个小时13分钟。 date 命令 /proc/uptime gbgb:~$ date -d "$(awk -F. {print $1} /proc/uptime) second ago&…...
Istio 补充 Kubernetes 的不足
1 Istio 补充 Kubernetes 的不足 Kubernetes 强大但无法解决复杂分布式系统中的非功能性需求,如流量路由、协议转换、请求重试和负载均衡。Istio作为Service Mesh,通过独立的代理进程处理这些需求,避免直接修改业务代码。 2. 独立的代理进程…...
以图像识别为例,关于卷积神经网络(CNN)的直观解释
大家读完觉得有意义记得关注和点赞!!! 作者以图像识别为例,用图文而非数学公式的方式解释了卷积神经网络的工作原理, 适合初学者和外行扫盲。 目录 1 卷积神经网络(CNN) 1.1 应用场景 1.2 起…...
使用PyTorch实现基于稀疏编码的生成对抗网络(GAN)在CIFAR-10数据集上的应用
使用PyTorch实现基于稀疏编码的生成对抗网络(GAN)在CIFAR-10数据集上的应用 目录 使用PyTorch实现基于稀疏编码的生成对抗网络(GAN)在CIFAR-10数据集上的应用1. 引言2. 数据集介绍3. 模型网络结构3.1 网络结构3.2 编码器3.3 生成器3.4 判别器4. 模型优化器与损失函数4.1 优…...
Java重要面试名词整理(十八):Sentinel
文章目录 服务雪崩及其解决方案技术选型: Sentinel or Hystrix 流量治理组件Sentinel**基于SentinelResource注解埋点实现资源保护** Sentinel控制台**限流阈值类型****流控模式****直接****关联** **流控效果**系统规则——系统自适应保护 限流算法**计数器法****滑动时间窗口…...
【微信小程序获取用户手机号
微信小程序获取用户手机号有2种,一种是前端自己解密,一种是获取后发给后端,后端去解密 重点:要在微信公众平台设置里面绑定微信开放平台账号,不然反解不出来用户手机号上代码: <button style"font-size: 16px;" open-type"getPhoneNumber" getphonenumb…...
Profinet转EtherNet/IP网关连接AB PLC的应用案例
某大型制造企业的生产车间同时采用了西门子 S7 - 1500 PLC 作为核心控制系统的一部分,负责主要生产流程的控制与数据处理;而在特定生产环节,由于历史设备遗留或工艺配套需求,存在使用 AB PLC 的情况。这就导致了在整个自动化生产系…...
Maven的依赖管理
1. 依赖管理 依赖管理,可以将有关依赖项的所有信息放在共同的POM中,并对子POM中的工件进行更简单的引用。举个例子: 父POM <project>......<dependencyManagement><dependencies><dependency><groupId>gro…...
验证码识别插件 - captcha-killer
验证码识别插件 - captcha-killer 简介 captcha-killer 是一款用于 Burpsuite 的验证码识别插件。它的主要功能是调用各种验证码识别接口,以便在进行渗透测试时能够自动识别和绕过验证码。这个插件本身并不直接进行验证码的识别,而是通过调用外部的 OC…...
面试题解,Java中的“对象”剖析
一、说一说JVM中对象的内存布局?new一个对象到底占多大内存? 话不多说,看下图,对象的内存布局图 一个对象的内存布局主要由三部分组成:对象头(Object Header)、实例数据(Instance D…...
对计网大题的一些指正(中间介绍一下CDM的原理和应用)
目录 前言: (1)五层原理体系结构每层功能: 下面是文档的答案: 我在之前的博客里面有介绍过五层原理体系结构, 按理来说,第五层应该是应用层才对,而会话层的功能应该被放到应用层…...
122. 买卖股票的最佳时机 II
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150问题分析: 和买卖股票的最佳时机I这题相比,区别就是可以买多只股票虽然同时只能持有一支,但是我们还是可以…...
qt中如何判断字符串是否为数字,整数,浮点数?
在 Qt 中,可以使用多种方法来判断字符串是否为数字、整数或浮点数。Qt 提供了一些方便的字符串和数值处理函数,可以帮助你实现这些判断。以下是几种常见的方法: 1. 使用 QRegularExpression Qt 提供了 QRegularExpression 类,可…...
《GICv3_Software_Overview_Official_Release_B》学习笔记
1.不同版本的 GIC 架构及其主要功能如下图所示: 2.GICv2m(Generic Interrupt Controller Virtualization Model)是针对ARM架构的GIC(通用中断控制器)的一种扩展, GICv2m扩展为虚拟化环境中的中断管理提供了…...
告别Kibana:Elasticsearch 桌面客户端的新变革
告别Kibana:Elasticsearch 桌面客户端的新变革 在大数据处理与分析领域,Elasticsearch 及其相关技术的应用日益广泛。长期以来,Kibana 在数据可视化与查询管理方面占据重要地位,但随着技术的不断发展,用户对于更高效、…...
【蓝桥杯研究生组】第14届Java试题答案整理
试题链接:链接 A题 满足条件的答案有:35813116 public class TianShu {public static void main(String[] args) {int ans 0;// 2000.1.1 - 2000000.1.1// 年份是月份的倍数,也是日的倍数for (int year2000; year<2000000; year) {for …...
链式调用方式重写父类set方法导致fastjson解析的对象属性未赋值
反序列化后发现属性为null 昨天使用fastjson的JSON.parseArray(json, class)反序列化的时候,发现返回的list列表中的对象某个属性为null,但是json字符串里面这个属性是有值的,经过排查发现是因为子类重写了父类的set方法,且返回值…...
[AUTOSAR 基础入门] - AUTOSAR配置工具
返回总目录 前文我们提到了要借助 EasySAR 平台来助力大家更好地融合 AUTOSAR 的理论与实践,让大家能够切实将所学知识转化为实际操作能力。建议大家感兴趣的去注册一下看看。跳转链接:EasySAR EasySAR是昂辉科技基于 AUTOSAR 方法论设计的一款面向汽车…...
鸿蒙开发:实现键值数据库存储
前言 鸿蒙当中数据持久化存储,为我们提供了多种的实现方式,比如用户首选项方式,关系型数据库方式,键值型数据库方式,文件存储方式等等,对于数据量比较的小的,我们直接选择轻量级的用户首选项方式…...
ip属地的信息准确吗?ip归属地不准确怎么办
在数字化时代,IP属地信息成为了我们日常生活中不可或缺的一部分。在各大社交媒体平台上,IP属地信息都扮演着重要的角色。然而,随着技术的不断进步和网络的复杂性增加,IP属地信息的准确性问题也日益凸显。那么,IP属地信…...
CSS——1.优缺点
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><link rel"stylesheet" type"text/css" href"1-02.css"/></head><body><!--css:层叠样式表…...
Android设备使用AOA协议进行主机与配件模式通信
1.使用TYPC-C数据线连接两台华为手机: TYPE-C线,先连接下图右边的ACCESSORY 再连接左边的HOST 此时左边的HOST(白色) 会给右边的ACCESSORY(黑色) 充电 接着打开左连接的HostChart会自动调起授权,然后会启动右边的AccessoryChart USB HOS…...
MySQL中深度分页问题的优化
MySQL中深度分页问题的优化 在MySQL中,使用LIMIT子句进行分页查询时,可能会遇到一个常见的性能问题:当LIMIT子句中的偏移量X很大时,查询速度会显著下降。例如,LIMIT 0,10可能只需要20毫秒,而LIMIT 1000000,…...
5. C语言 常量与宏定义
本章目录: 前言一、什么是常量?1. 整型常量2. 浮点型常量3. 字符常量4. 字符串常量 二、如何定义常量?1. 使用 #define 宏定义2. 使用 const 关键字 三、#define 和 const 的区别四、使用建议1. 使用场景区分2. 避免宏定义的潜在问题 五、特殊用法与小技…...
【mybatis-plus问题集锦系列】mybatis使用xml配置文件实现数据的基础增删改查
简单的数据查询,我们可以在mapper接口里面去实现,但是如果是复杂的查询,我们就可以使用xml配置文件去做, 官网链接xml配置文件 实现效果 实现代码 根据mapper接口的包结构,在resources包里面新建同名同结构的xml文件…...
spring防止重复点击,两种注解实现(AOP)
第一种:EasyLock 简介 为了简化可复用注解,自己实现的注解,代码简单随拿随用 使用方式 1.创建一个注解 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface EasyLock {long waitTime() default …...
Spring Boot 3 实现 MySQL 主从数据库之间的数据同步
✅ Spring Boot 3 实现 MySQL 主从数据库之间的数据同步 在实际项目中,为了提高 系统的读性能 和 数据的可用性,通常会使用 主从数据库架构。Spring Boot 提供了对 多数据源 的良好支持,可以轻松配置 主从数据库 的数据同步,实现 读写分离。 🎯 方案介绍 我们将通过 Sp…...
WPS-JS宏快速上手
WPS JS宏注意事项 代码后面可以不写分号“ ; ”; 缩进对程序的运行影响不大,但为了易读(防止自己以后看不懂),还是乖乖写好; 代码是逐行运行的,意味着下面一行代码错了,前面的代码…...
力扣hot100——堆
215. 数组中的第K个最大元素 快速排序 class Solution { public:int findKthLargest(vector<int>& a, int k) {auto qsort [&](this auto&& qsort, int l, int r) -> void {if (l r) return;int i l - 1, j r 1;int x a[(l r) / 2];/*如果把…...
【小制作】米家模拟手指点击
代码功能解释 这段代码是一个基于Arduino平台的控制程序,主要功能包括: 初始化:设置引脚模式、初始化编码器、舵机和EEPROM。按键检测:处理按钮的单击、双击和长按事件,并根据事件执行相应操作。编码器更新ÿ…...
ubuntu1604 apt镜像源切换
1、如何查看当前源 cat /etc/apt/sources.list less /etc/apt/sources.list 2、apt源修改为阿里镜像,这里ubuntu是1604: deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/…...