使用 GD32F470ZGT6,手写 I2C 的实现
我的代码:https://gitee.com/a1422749310/gd32_-official_-code
I2C 具体代码位置:https://gitee.com/a1422749310/gd32_-official_-code/blob/master/Hardware/i2c/i2c.c
黑马 - I2C原理
官方 - IIC 协议介绍
个人学习过程中的理解,有错误,欢迎指出
移植
【I2C 具体代码位置】中,要更改代码的地方
#define SCL(bit) gpio_bit_write(GPIOB, GPIO_PIN_6, bit == 1 ? SET : RESET);
#define SDA(bit) gpio_bit_write(GPIOB, GPIO_PIN_7, bit == 1 ? SET : RESET);
#define DELAY() delay_1us(5);#define SDA_IN() gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
#define SDA_OUT() gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
#define SDA_STATE() gpio_input_bit_get(GPIOB, GPIO_PIN_7)以及
void I2C_Init()
其他地方,都是和平台无关的
写数据
SCL、SDA 数据的四种形式
SCL 和 SDA 的高低电平的持续时间是多少?
回答这个问题,需要涉及:I2C总线的时钟频率
I2C总线的时钟频率,通常在100kHz到400kHz之间,其中
- 100kHz是标准模式(Standard Mode)
- 1秒钟,就是 1 000 000us,100 000 个bit,相除,可得:10us 1bit
- 👆 10us,才得到一个 bit,那么,睡眠的时候,就是 5us(一半,用于开始、停止的变化)
- 400kHz是快速模式(Fast Mode)
- 1秒钟,就是 1 000 000us,400 000 个bit,相除,可得:2.5us 1bit
此外,I2C总线还支持更高速度
- 1秒钟,就是 1 000 000us,400 000 个bit,相除,可得:2.5us 1bit
- 高速模式(High Speed Mode):1MHz
- 超高速模式(Ultra-Fast Mode):5MHz
因此,SCL 和 SDA 的高低电平的持续时间是多少?要看具体使用的 I2C 的外设的 datasheet
比如,如果某个 datasheet 上面写了 100kHz,那么,就是 10us 1bit,就 #define DELAY() delay_1us(5);
开始、结束、发送、等待响应总结
- 开始(Start):正弦函数
- 结束(Stop):左边有 1 竖(都是低电平)的【凹函数】
- 发送(Send):SDA准备 🏃,持续3个delay;SCL 从暴富到破产(或者理解为跳水,但是,跳水,SDA 用了。 所以,可以这么理解:SCL,老板,指挥官,与财富相关,SDA,员工,行动派,与行为相关)
- 等待响应(Wait ACK):SCL、SDA 亲亲😘;SCL 从暴富到破产,SDA 控制权转移
👆 很奇怪,之前用【亲亲】,感觉不好意思🥵,于是改成【靠近】,后来发现,还是亲亲好,上头😓
👇 可以看到,只有【开始】(绿点)和【结束】(橙点),有比较长的 SCL(上面的信号是 SCL)(也印证了SCL 连续高两次)
懒得复制图片了,直接看这个链接吧 黑马 - IIC
1、开始 Start:【正弦函数】
[图片]
- 1:SCL 之前,SDA,一定是高的,不然没法下落
- 2:SCL,暴富,站起来了(起作用了)
- 3:将 SDA 拉低
- 4:SCL,破产,没落了,代表之后不起作用了(虎落平阳被犬欺)
买的淘宝链接(👈 LIXIN 给的链接,买贵了。。。)19.5 USB逻辑分析仪
黑马 - 逻辑分析仪
下载:逻辑分析仪Logic-2.4.9-windows-x64.exe
[图片]
[图片]
I2C 要进行配置 👇
[图片]
[图片]
[图片]
最终 👇,注意采样率,不要太低,我之前设置为 100kS/s,采样的波形,是错误的(当时没理解概念,将 100kS/s 和之前的 100kHz是标准模式 那个联系在一起了🤡。。。)
[图片]
2、结束 Stop:左边有 1 竖的【凹函数】
[图片]
[图片]
👆,这里,开始的 4 和结束的 1,共了
-
1:SCL、SDA 同时变低,方便 SCL 站起来
-
2:SCL,暴富,站起来了(起作用了)
-
3:SDA,上岸(游泳🏊结束)
static void stop() {
SCL(0);
SDA(0);
DELAY(); // <— 视频中没有加 delaySCL(1);
DELAY();SDA(1);
DELAY();
}
2.1、结束代码,有问题
👆 视频中代码有问题,没有加 delay
[图片]
[图片]
测试代码如下 👇,对应波形 👆
可以看到,stop 中,SCL(0)、SDA(0) 后,立马 SCL(1),在波形上,显示的是,是很窄的一个波形(👆 右图中,绿色,1、1 的框框)
另外,注意上面图片中,中间的区域,我将其设置为 11、00、11,目的是为了对比(之后 2.2 中,有关于对这个波形的讨论)
static void stop()
{
SDA_OUT(); // SDA 重新获得控制权,SDA 变成输出
SCL(0);
SDA(0);
// DELAY(); 未加 delaySCL(1);
DELAY();SDA(1);
DELAY();
}
void test_wave()
{
start();
// 中间
SCL(1); SDA(1); DELAY();SCL(0); SDA(0); DELAY();SCL(1); SDA(1); DELAY();stop();
}
加上 delay 之后的波形 👇
[图片]
[图片]
所以我认为,虽然效果是一样,但是,还是加下好些
2.2、结束代码,有问题例子中,中间波形分析
// 中间
SCL(1); SDA(1); DELAY();
SCL(0); SDA(0); DELAY();
SCL(1); SDA(1); DELAY();
[图片]
[图片]
👆,并不是我之前认为的,SCL(1) 、SDA(1),波形就同时变高,而是有一个偏移(SDA,向右偏一点)
并且,SCL(1)、SDA(1),宽度也是不一样的
那么,如果我先设置 SDA 呢?
// 中间
SDA(1); SCL(1); DELAY();
SDA(0); SCL(0); DELAY();
SDA(1); SCL(1); DELAY();
[图片]
[图片]
👆 右图,因为 SDA 提前设置,所以,在 SCL 之前,变低(图中显示,红色在黄色,内部)
但是,之后,第 3 个 SDA(1); SCL(1);,预想中,应该是 SDA 先拉高,SCL 在拉高(可实际上,是 SCL 先拉高)
一种解释,是程序编译的时候,SDA(1); SCL(1); 交换了位置???那为什么 SDA(0); SCL(0); 没有交换?
所以,应该不是这个原因
另一种解释:SDA(1),SDA 拉高的时候,相比于 SCL(1) ,比较耗时,我认为这个是比较合理一点的解释
问下 ChatGPT
你的分析非常到位!让我们一起深入探讨你提出的两个可能的解释:
- 程序编译时的代码顺序
这种解释是比较不太可能的原因。在编译阶段,SDA(1) 和 SCL(1) 的顺序应该是严格按照程序中写的顺序执行的,编译器并不会自动交换这些信号的顺序,除非有特别的宏或硬件抽象层对这些函数做了特殊的处理。所以,SDA(1) 和 SCL(1) 顺序交换的问题,可以排除。 - SDA 拉高的耗时问题
这个解释是比较合理的。
- SDA 拉高时的时间问题:由于 I2C 总线的物理特性,SDA 线上的信号变化相对较慢,尤其是在高电平拉升时。如果你直接将 SDA 设置为高电平,可能需要一点时间来使 SDA 线达到稳定的高电平状态。而 SCL 线在此时是由外部的时钟拉升的,这意味着如果没有延时,SCL 会很快拉高,但 SDA 可能还没有达到稳定的高电平,导致了信号的不稳定或者错误。
- SCL 的变化时间较短:SCL 线的状态变化通常由外部时钟控制,所以其变化速度通常比较快。而 SDA 由于是由主设备控制,并且存在内部拉升电阻或者其他电路因素,所以 SDA 的拉高通常会稍微慢一些,尤其是在低电平拉升到高电平时,可能会有延迟。
为什么 SDA(0); SCL(0); 没有问题?
当你将 SDA 和 SCL 都拉低时,情况就简单了。因为 I2C 的标准定义在 SDA 和 SCL 都为低电平时,它们处于稳定状态,几乎没有信号的延迟或时序问题。所以 SDA(0); SCL(0); 不会引起问题。
总结:
更可能的原因是 SDA 拉高时的时间延迟。 由于 SDA 拉高的过程相较于 SCL 更加耗时,可能会导致在 SDA(1) 和 SCL(1) 同时设置时,SCL 先拉高了,而 SDA 还没有完全稳定。
3、发送 Send:SDA准备,持续3个delay;SCL 从暴富到破产
[图片]
[图片] - 1:SDA 准备了
- 2:SCL,暴富,站起来了(起作用了)
- 3:SCL,破产,没落了,代表之后不起作用了(虎落平阳被犬欺)
👆,可以看到,起作用的传输数据,持续了 3 的 delay(准备前、SCL 变高时、SCL 变低时)
4、等待响应 Wait ACK:SCL、SDA 亲亲😘;SCL 从暴富到破产,SDA 控制权转移
[图片]
[图片]
- 1:SCL、SDA 亲亲😘:SDA 变高,期望跳水;;;SCL 变低,破产,期望暴富,起作用,站起来
- 2:SCL 高电平,站起来了(起作用了),此时,SDA,已经让出控制权了,然后,观察 SDA
- SDA:低电平,代表应答
- SDA:高电平,代表不应答
- SDA,代表了,主动权
- 3:SCL,没落了,代表之后不起作用了(虎落平阳被犬欺)
模拟下成功,然后看看波形
模拟的时候,不要开 SDA_IN,会影响波形
static void wait_ack()
{
SDA(1);
SCL(0);
DELAY();
#if MOCK_WAIT_ACK_SUCCESS == 0
// SDA 交出控制权,SDA 变为输入
SDA_IN();
#endif
SCL(1);
#if MOCK_WAIT_ACK_SUCCESS
// 模拟从机,将 SDA 置 1,代表成功响应主机
SDA(0);
#endif
DELAY();
if (RESET == SDA_STATE() || 1 == MOCK_WAIT_ACK_SUCCESS)
{// 成功SCL(0);SDA_OUT(); // SDA 重新获得控制权,SDA 变成输出
}
else
{stop();
}
}
最终波形如下 👇
[图片]
[图片]
读
read
rece 和 send 通讯信号都是一样的,但是区别:SDA 的信号来源,来自:从设备
[图片]
发送响应:SCL、SDA 开始:ACK 不亲亲🫸,NACK 亲亲😘;SCL 从暴富到破产;最后都亲亲😘
[图片]
[图片]
最后,I2C_Read(0x01, 0x02, &data, 1);(后面 len 改为 2,可以分析 ACK) 输出波形如下
[图片]
[图片]
[图片]
[图片]
可以看到,接收,只有 1、2 —— 设置,是在 SCL(0) 的时候,设置的
模拟代码如下 👇,1011 0010 = 0xB2,和波形一致
#define MOCK_READ_DATA 1
static uint8_t recv()
{
#if MOCK_READ_DATA == 0
// SDA 交给从设备,主设备,应该是输入状态
SDA_IN();
#endif
#if MOCK_READ_DATA
// 1011 0010 = 0xB2
uint8_t mock_bit_array[8] = {1, 0, 1, 1, 0, 0, 1, 0};
#endif
uint8_t data = 0;
for (uint8_t i = 0; i < 8; i++)
{// 给机会,给从设备,准备数据SCL(0);
#if MOCK_READ_DATA
SDA(mock_bit_array[i]); // <— 设置,是在 SCL(0) 的时候,设置的
#endif
DELAY();
// 开始设置数据有效性SCL(1);
#if MOCK_READ_DATA
data |= mock_bit_array[i] << (7 - i);
#else
data |= SDA_STATE() << (7 - i);
#endif
DELAY();// SCL(0); 因为下一个循环,还是低电平,这里可以省略
}
// 最后一次,是高电平,不会循环回来,所以,要加上低电平,代表 SCL 没落了
SCL(0);return data;
}
相关文章:
使用 GD32F470ZGT6,手写 I2C 的实现
我的代码:https://gitee.com/a1422749310/gd32_-official_-code I2C 具体代码位置:https://gitee.com/a1422749310/gd32_-official_-code/blob/master/Hardware/i2c/i2c.c 黑马 - I2C原理 官方 - IIC 协议介绍 个人学习过程中的理解,有错误&…...
力扣 53. 最大子数组和 (动态规划)
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出:…...
【牛客小白月赛107 题解】
比赛链接 A. Cidoai的吃饭 题目大意 给定一个正整数 n n n,再给定三个正整数 a , b , c a, \ b, \ c a, b, c。初始时 a n s 0 ans 0 ans0。现在开始循环,每次循环按照从上到下的顺序选择第一条符合的执行(即执行完就再从 1. 1. 1. …...
Web day11 SpringBoot原理
目录 1.配置优先级: 2.Bean的管理: bean的作用域: 第三方bean: 方案一: 方案二: SpringBoot原理: 扫描第三方包: 方案1:ComponentScan 组件扫描 方案2࿱…...
JAVA实战:借助阿里云实现短信发送功能
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在…...
【C语言】库函数常见的陷阱与缺陷(3):内存分配函数
目录 一、malloc 函数 1.1. 功能与常见用法 1.2. 陷阱与缺陷 1.3. 安全使用建议 1.4. 安全替代和代码示例 二、calloc 函数 2.1. 功能与常见用法 2.2. 陷阱与缺陷 2.3. 安全使用建议 2.4. 安全替代和代码示例 三、realloc 函数 3.1. 功能与常见用法 3.2. 陷阱与缺…...
探索 Python 编程调试案例:程序平均值的修复过程
💝💝💝Python 作为一门广泛应用的编程语言,其编程过程并非总是一帆风顺。即使是经验丰富的程序员,也会在代码中遇到各种错误。而调试Python代码过程,也是学习中不可避免的步骤。 今天来看一个简单的案例。…...
奇奇怪怪的错误-Tag和space不兼容
报错信息如下: TabError: inconsistent use of tabs and spaces in indentation make: *** [Makefile:24: train] Error 1不能按Tab,要老老实实按space 不过可以在编辑器里面改,把它们调整成一致的;...
linux网络编程 | c | epoll实现IO多路转接服务器
epoll实现IO多路转接服务器 可通过以下视频学习 06-opell函数实现的多路IO转接_哔哩哔哩_bilibili 通过响应式–多路IO转接实现 文章目录 epoll实现IO多路转接服务器1.思路&功能核心思路 2.代码实现multi_epoll_sever.c运行图 1.思路&功能 **功能:**客…...
16-2.Java 反射之 setAccessible 方法详解(Java 访问检查、反射的访问检查、setAccessible())
一、Java 访问检查 1、基本介绍 访问检查就是查看成员使用是否符合访问权限(public、protected、default、private) 2、演示 Person.java package com.my.entity;public class People {private int privateVar 1;int defaultVar 2;protected int …...
颜色的基本处理
数码相机能够获取彩色图像,但相机的色彩处理是一个非常复杂的过程,是非常重要的。 此过程生产制造商在细节方面都是不公布的,但是基本的概念是相同的。当相机捕捉一个真实场景时,是怎么还原成人眼所看到的图像呢? 1.R…...
提升音频转录准确性:VAD技术的应用与挑战
引言 在音频转录技术飞速发展的今天,我们面临着一个普遍问题:在嘈杂环境中,转录系统常常将非人声误识别为人声,导致转录结果出现错误。例如,在whisper模式下,系统可能会错误地转录出“谢谢大家”。本文将探…...
3D一览通在线协同设计,助力汽车钣金件设计与制造数字化升级
汽车行业已迎来智能化的汹涌浪潮,在此背景下,零部件制造商唯有积极应对,以智能制造为核心驱动力,方能跟上行业发展步调,在激烈的市场竞争中抢占先机。作为整车制造不可或缺的核心组件之一,汽车钣金件亦需紧…...
C 进阶 — 字符函数和字符串函数 ( 二 )
C 进阶 — 字符函数和字符串函数 ( 二 ) 书接上回 C 进阶 — 字符函数和字符串函数 ( 一 ) 1.9 strtok 参考资料 strtok 函数用法详解 char * strtok ( char * str, const char * sep );strtok 是 [C 标准库](https://so.csdn.net/so/search?qC 标准库&spm1001.2101.3…...
【Qualcomm】IPQ5018查看连接终端RSSI、SNR、NF方法
IPQ5018 简介 IPQ5018 是高通(Qualcomm)公司推出的一款面向网络设备的系统级芯片(SoC)。它通常用于路由器、接入点和其他网络设备中,提供高性能的无线网络连接。以下是关于 IPQ5018 的一些关键特性和功能: 关键特性 高性能处理器 IPQ5018 集成了多核 CPU,通常是 ARM …...
Windows下编译安装FreeCAD 1.0.0
本文记录在Windows下编译安装FreeCAD 1.0.0的流程。 零、环境 操作系统Windows 11VS Code1.92.1Git2.34.1Visual StudioVisual Studio Community 2022CMake3.22.1 一、编译安装 1.1 安装依赖 从FreeCAD GitHub下载LibPack-1.0.0-v3.0.0-Release.7z,并解压。 1.2…...
Hadoop其一,介绍本地模式,伪分布模式和全分布搭建
目录 一、Hadoop介绍 二、HDFS的本地模式 三、伪分布模式 四、Hdfs中的shell命令 五、全分布搭建 六、使用Java代码操作HDFS 1、环境准备 2、单元测试(Junit)编辑 一、Hadoop介绍 Hadoop 分为三部分 : Common、HDFS 、Yarn、MapRe…...
蓝桥杯刷题——day3
蓝桥杯刷题——day3 题目一题干题目解析代码 题目二题干题目解析代码 题目一 题干 每张票据有唯一的 ID 号,全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造…...
【Leecode】Leecode刷题之路第79天之单词搜索
题目出处 79-单词搜索-题目出处 题目描述 个人解法 思路: todo代码示例:(Java) todo复杂度分析 todo官方解法 79-单词搜索-官方解法 方法1:回溯 思路: 代码示例:(Javaÿ…...
海康威视监控web实时预览解决方案
海康威视摄像头都试rtsp流,web页面无法加载播放,所以就得转换成web页面可以播放的hls、rtmp等数据流来播放。 一:萤石云 使用萤石云平台,把rtsp转化成ezopen协议,然后使用组件UIKit 最佳实践 萤石开放平台API文档 …...
virtualbox 搭建ubuntu
环境:VirtualBox-6.1.32 1、下载安装virtualbox 略 2、新建ubuntu 3、配置ubuntu 选择虚拟盘 4、安装ubuntu 5、安装ssh sudo apt install openssh-server openssh-client 查看ip 6、安装samba sudo apt install samba 查看ssh启动状态 sudo systemctl stat…...
RK3588开发笔记-Buildroot编译Qt5WebEngine-5.15.10
目录 前言 一、Qt5WebEngine简介 二、Qt5WebEngine编译 总结 前言 Rockchip RK3588是一款强大的多核处理器,广泛应用于边缘计算、人工智能、嵌入式系统等领域。为了在RK3588上运行自定义的Linux系统,并使用Qt5WebEngine进行Web内容渲染,Buildroot是一个非常合适的工具。本…...
FedAdam算法:供给方信用,数据质量;更新一致性
FedAdam算法:供给方信用,数据质量;更新一致性 FedAdam算法概述 FedAdam是一种联邦学习(Federated Learning)算法。联邦学习是一种机器学习技术,它允许在多个设备或数据中心(称为客户端)上训练模型,而无需将数据集中到一个中央服务器,从而保护数据隐私。FedAdam主要用于…...
webrtc音频模块(三) windows Core Audio API及声音的播放
在前面介绍了ADM(Audio Device Module),它用于抽象音频设备管理和音频数据采集/播放接口。windows的实现是AudioDeviceWinowCode,它封装了Core Audio APIs实现了对音频设备的操作。 Core Audio APIs windows提供了多种音频操作API,比如最常…...
使用ERA5数据绘制风向玫瑰图的简易流程
使用ERA5数据绘制风向玫瑰图的简易流程 今天需要做一个2017年-2023年的平均风向的统计,做一个风向玫瑰图,想到的还是高分辨率的ERA5land的数据(0.1分辨率,逐小时分辨率,1950年至今)。 风向,我分为了16个&…...
深度优先遍历(DFS)
深度优先遍历(DFS) 1. 计算布尔二叉树的值2. 求根节点到叶节点数字之和3.二叉树剪枝4.验证二叉搜索树5. 二叉搜索树中第 K 小的元素6. 二叉树的所有路径 深度优先遍历(DFS,全称为Depth First Traversal),是…...
国科大网络协议安全期末
完整资料仓库地址:https://gitee.com/etsuyou/UCAS-Network-Protocol-Security 部分题目: 六 论述题10*220 试讨论IPv6解决了IPv4的哪些“痛点”,以及IPv6存在的安全问题试比较IPsec与SSL的安全性 五 简答题5*315 简述MAC欺骗和ARP欺骗的…...
开源密码管理器 Bitwarden 一站式管理所有密码以及 2FA
本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 随着注册的平台越来越多,管理密码的难度也越来越高了。要是把密码都设置成一样的,担心哪天某个平台泄露被一锅端,而每个平台单独一个密码又不太好记,这时候就…...
Python爬虫之Selenium的应用
【1】Selenium基础介绍 1.什么是selenium? (1)Selenium是一个用于Web应用程序测试的工具。 (2)Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。 (3)支持通过各种driv…...
华为无线AC、AP模式与上线解析(Huawei Wireless AC, AP Mode and Online Analysis)
华为无线AC、AP模式与上线解析 为了实现fit 瘦AP的集中式管理,我们需要统一把局域网内的所有AP上线到AC,由AC做集中式管理部署。这里我们需要理解CAPWAP协议,该协议分为两种报文:1、管理报文 2、数据报文。管理报文实际在抓包过程…...
k8s中用filebeat文件如何收集不同service的日志
以下是一个详细的从在 Kubernetes 集群中部署 Filebeat,到实现按web-oper、web-api微服务分离日志并存储到不同索引的完整方案: 理解需求:按服务分离日志索引 在 Kubernetes 集群中,有web-oper和web-api两种微服务,希…...
linux常用命令(cd、ls)
命令cd cd 是 Linux 系统中用于改变当前工作目录的命令。它是 "change directory" 的缩写。以下是关于 cd 命令的详细解释和使用方法: 基本用法 cd [目录路径]:将当前工作目录切换到指定的目录路径。 常用选项与示例 1、切换到指定目录 …...
Java实现一个带头节点的单链表
什么是单链表? 单链表是一种基础的数据结构,其中每个节点都包含两部分: 数据域:存储节点数据。指针域:存储指向下一个节点的引用。 为什么使用头节点? 头节点的存在简化了操作逻辑: 统一操作…...
代码随想录-算法训练营-番外(图论01:图论理论基础,所有可到达的路径)
day01 图论part01 今日任务:图论理论基础/所有可到达的路径 代码随想录图论视频部分还没更新 https://programmercarl.com/kamacoder/图论理论基础.html#图的基本概念 day01 所有可达路径 邻接矩阵 import java.util.Scanner;import java.util.List;import java.util.ArrayL…...
js:我要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写
问: 我按在要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写? 回答: 问: <div v-for"(item, index) in centrerTopdata.slice(0, 3)" :key"index"> d…...
软考高级架构 - 10.5 软件架构演化评估方法
10.4 软件架构演化原则总结 本节提出了18条架构演化的核心原则,并为每条原则设计了简单而有效的度量方法,用于从系统整体层面提供实用信息,帮助评估和指导架构演化。 演化成本控制:成本小于重新开发成本,经济高效。进…...
40 list类 模拟实现
目录 一、list类简介 (一)概念 (二)list与string和vector的区别 二、list类使用 (一)构造函数 (二)迭代器 (三)list capacity (四&#x…...
【原生js案例】如何实现一个穿透字体颜色的导航
普通的导航大家都会做,像这种穿透字体的导航应该很少见吧。高亮不是通过单独设置一个active类来设置字体高亮颜色,鼠标滑过导航项,字体可以部分是黑色,不分是白色,这种效果的实现 感兴趣的可以关注下我的系列课程【we…...
(RHCE)工程师学习考证
如果你像我一样,非科班出身且对 IT 行业知识储备几乎为零,却立志考取 RHCE 红帽工程师证书,那么以下这份学习教程或许能助你一臂之力。 首先,要对 RHCE 有个基本的认识。RHCE 是红帽企业级 Linux 认证,它侧重于实际操作…...
Nuxt3 axios封装 使用axios接口请求
一、先安装axios npm install add axios 封装请求request.ts文件 import axios from axios import { ElMessage, Message } from "element-plus" import {getToken} from ./token.js const service axios.create({baseURL:/api,//本地使用 }) service.interceptor…...
东方通TongWeb替换Tomcat的踩坑记录
一、背景 由于信创需要,原来项目的用到的一些中间件、软件都要逐步替换为国产品牌,决定先从web容器入手,将Tomcat替换掉。在网上搜了一些资料,结合项目当前情况,考虑在金蝶AAS和东方通TongWeb里面选择,后又…...
引用类型集合的深拷贝,无需手动写循环:Apache Commons Lang (SerializationUtils)
在java中,我们如果想要对引用类型的集合进行深拷贝。有一种方式,就是调用SerializationUtils Apache Commons Lang (SerializationUtils) Apache Commons Lang 提供了 SerializationUtils 类,可以利用 Java 的序列化机制来进行集合及其元素…...
高阶函数:JavaScript 编程中的魔法棒
在JavaScript的世界里,高阶函数是一种强大的工具,它允许我们将函数作为参数传递或将函数作为返回值。这种特性使得JavaScript代码更加灵活和强大。本文将深入探讨高阶函数的定义、用法以及在实际项目中的最佳实践,帮助大家更好地理解和应用这…...
HuggingGPT Solving AI Tasks with ChatGPT and its Friends in Hugging Face 论文解读
1. 引言 近年来,大型语言模型(LLMs)如ChatGPT在自然语言处理领域取得了惊人的进展,展现出强大的语言理解、生成和推理能力。然而,当前的LLMs仍然存在一些局限性,例如无法处理复杂信息(如视觉和…...
使用 ADB (Android Debug Bridge) 工具来截取 Android 设备的屏幕截图
可以使用 ADB (Android Debug Bridge) 工具来截取 Android 设备的屏幕截图。以下是具体的操作步骤: 1. 连接设备 确保 Android 设备通过 USB 或网络连接到电脑,并运行以下命令检查连接状态: adb devices2. 截取屏幕截图 运行以下命令将设…...
router.resolve 方法
router.resolve 方法在前端路由库(如 Vue Router)中用于解析路由信息。它接受一个路由对象或路径,并返回一个包含解析后的路由信息的对象。这个对象通常包含 href、route、location 等属性。 用法总结 方法签名: router.resolve(…...
linux 安装 Jenkins 教程
前言 Jenkins 是一个开源的自动化服务器,广泛用于持续集成(Continuous Integration,CI)和持续交付(Continuous Delivery,CD)领域。它帮助开发者自动化软件构建、测试、部署等过程,从…...
Vue3 使用 render 渲染函数透传组件
背景 我们透传组件的时候可能会用 slot,本文讲述的是另一种方式 props render 函数方式。当然具体的看业务场景。 实现 父组件 <AComp customComponent: () > {return h(UserAuthorization) }> </AComp>子孙组件 // 定义 render 组件ÿ…...
MongoDB 分片
MongoDB 分片 MongoDB 分片是一种数据库架构,用于将大量数据分布存储在多个服务器上。这种设计允许数据库扩展,以处理大量数据和高吞吐量操作。分片通过将数据集分割成小块,称为分片,并将这些分片分布到多个服务器上来工作。每个…...
Chrome webdriver下载-避坑
WebDriver以原生的方式驱动浏览器,不需要调整环境变量。 一、window版 1.chrome和chromedriver下载地址: Chrome for Testing availability 我下载的是如下两个安装包,解压即可。 2.导包 pip install selenium然后用python代码引用即可…...