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

SPI通信协议

SPI通信协议

  • 简介
    • 通信原理
    • 通信原理
    • SPI数据通信的流程可以分为以下几步:
    • 通信特性
    • 设备时钟
    • 时钟速率
    • 时钟极性跟相位
    • SPI协议层
    • 通讯流程详解
      • 优点:
      • 缺点:
    • DS1302 时钟实验
      • 控制寄存器
      • 日历、时钟寄存器
      • 寄存器说明
    • DS1302 读写时序
      • 软件功能实现

简介

SPI是一种高速、全双工、同步通信总线,通常能达到甚至超过10M/bps最快可以超过50M/bps
主要有两种模式,通常有一个主模块和一个或多个从模块组成,主模块选择一个从模块进行同步通信,从而完成数据的交换
提供时钟的为主设备 接收时钟的设备为从设备 ,SPI接口的读写操作,都是由主设备发起,当存在多个从设备时,通过各自的片选信号进行管理

通信原理

需要4根线,单项传输时需要三根线(半双工),分别是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)和CS/SS(片选)
CS/SS:从设备使能信号,由主设备控制,一主多从时,CS/SS是从芯片是否被主芯片选中的控制信号,只有片选信号为预先规定的使能信号时(高低电位),主芯片对此芯片的操作才有效

在这里插入图片描述

通信原理

SPI主设备和从设备都有一个串行移位寄存器,主设备通过向他的SPI串行寄存器写入一个字节来发起一次传输
在这里插入图片描述

SPI数据通信的流程可以分为以下几步:

1、主设备发起信号,将CS/SS拉低,启动通信。
2、主设备通过发送时钟信号,来告诉从设备进行写数据或者读数据操作(采集时机可能是时钟信号的上升沿(从低到高)或下降沿(从高到低),因为SPI有四种模式,后面会讲到),它将立即读取数据线上的信号,这样就得到了一位数据(1bit)。
3、主机(Master)将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(缓存长度不一定,看单片机配置),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。
4、从机(Slave)也将自己的串行移位寄存器(缓存长度不一定,看单片机配置)中的内容通过MISO信号线返回给主机。
同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。
例如,下图示例中简单模拟SPI通信流程,主机拉低NSS片选信号,启动通信,并且产生时钟信号,上升沿触发边沿信号,主机在MOSI线路一位一位发送数据0X53,在MISO线路一位一位接收数据0X46,
在这里插入图片描述

通信特性

SPI是单主设备(Single Master)通信协议,只有一支主设备能发起通信,当SPI主设备想读/写从设备时,它首先拉低从设备对应的SS线(SS是低电平有效)。
在这里插入图片描述

设备时钟

SPI时钟特点主要包括:时钟速率、时钟极性和时钟相位三方面

时钟速率

SPI总线上的主设备必须在通信开始时候配置并生成相应的时钟信号。从理论上讲,只要实际可行,时钟速率就可以是你想要的任何速率,当然这个速率受限于每个系统能提供多大的系统时钟频率,以及最大的SPI传输速率

时钟极性跟相位

极性是指空闲时的电平,空闲时为低电平为0;高电平为1
相位是指采样数据时的位置,为0的时候是在上升沿采样,为1是在下降沿采样

在这里插入图片描述

SPI协议层

在这里插入图片描述

这是一个主机的通讯时序,MOSI与MISO的信号只有在NSS为低电平的时候才有效去,在SCK的每个时钟周期MOSI和MISO传输一位数据

通讯流程详解

  • 通讯的起始和停止信号 ,也就是在自己的NSS线检测到起始信号后,就开始于主机通讯,,停止就是NSS由低变高
  • 数据有效性: 一般采用MSB(高位先传),下降沿采样,上升沿触发,下降沿开始采样

优点:

    1. 无起始位和停止位,因此数据位可以连续传输而不会被中断;
    1. 没有像I2C这样复杂的从设备寻址系统;
    1. 数据传输速率比I2C更高(几乎快10倍);
    1. 分离的MISO和MOSI信号线,因此可以同时发送和接收数据;
    1. 极其灵活的数据传输,不限于8位,它可以是任意大小的字;
    1. 非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。

缺点:

  • 1.使用四根信号线,成本高
  • 2.无法确认是否已成功接收数据,也就是说只负责发送,至于接没接受到不管
  • 3.没有任何形式错误检查,数据的误差性有,如串口UART中的奇偶校验位
  • 4.只允许一个主设备
  • 5.没有应答信号,跟2很相似
  • 6.支持距离短

DS1302 时钟实验

开发板上集成了 1 个 DS1302 时钟模块,可使用它设计一个多功能电子时钟。本章要实现的功能是:系统运行时,数码管上显示电子时钟时分秒,格式为 “XX-XX-XX”。 芯片管脚如下:

在这里插入图片描述

  • 1.VCC2:主电源引脚
  • 2.X1、X2:DS1302 外部晶振引脚,通常需外接 32.768K 晶振
  • 3.GND:电源地
  • 4.CE:使能引脚,也是复位引脚(新版本功能变)。
  • 5I/O:串行数据引脚,数据输出或者输入都从这个引脚
  • 6.SCLK:串行时钟引脚
  • 7.VCC1:备用电源

控制寄存器

在这里插入图片描述

第七位:1
第六位:1代表RAM 寻找内部存储器地址,128字节地址,0代表CK,寻址内部寄存器,即特殊功能寄存器
第五到第一位:地址
最低位:操作方式 WR0为写 1为读RD 默认为0 WR上面横线代表低有效
在这里插入图片描述
以下面这张图为参考
在这里插入图片描述

比如要读秒寄存器 1000 0001,写就是1000 0000;正常就是读秒转换 当然如果说要快速计算的话用下面的可能更快一点,正常我们在写入时间的时候关闭写保护寄存器,这样才可以往里面写入时间,当我们写入完毕后就要关闭写保护,这样可以避免时间被修改,正常情况下我们就用第一条

日历、时钟寄存器

DS1302共有12个寄存器,其中有7个日历时钟相关,存放的数据为BCD码形式
在这里插入图片描述

当然可以这么理解,打个比方50二进制0011 0010, BCD表示就是0101 0000 它是分位表示的,它是按位分解的 ,50/16 =3 那么高位就是0011 余2低位就是0010 大概是这么个意思 自己去琢磨

在这里插入图片描述

寄存器说明

秒寄存器:低四位为秒的个数,高的次三位为秒的十位,最高位为CHCH=0时候内部时钟运行,反之CH=1时候停止
小时寄存器 最高位为12/24小时的格式选择位,该位为1的时候表示12小时格式,当设置为12小时格式显示时候,第5位 的高电平1表示下午(PM),而设置24小时格式时,第5位为具体时间数据

写保护寄存器 当该寄存器最高位WP为1时,DS1302只读不写 ,0时可以写

慢充电寄存器(涓细电流充电)寄存器:当DS1302掉电时,可以马上调用外部电源保护时间数据,保证时间正常走动,选项为备用电源使用,其中只有高四位(TCS)只有在 1010 时候才能使用充电选项

DS1302 读写时序

低位先读
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
(上图就是 DS1302 的三个时序:复位时序,单字节写时序,单字节读时序; CE(RST):复位时序,即在 RST 引脚产生一个正脉冲,在整个读写器件, RST 要保持高电平,一次字节读写完毕之后,要注意把 RST 返回低电平准备下次读写周期;)

在这里插入图片描述
DS1302 芯片的控制管脚接至单片机 P3.4-P3.6 上,在芯片的 X1、X2 管脚处外接了一个 32.768KHZ 晶振,为时钟运行提供一个稳定的时钟频 率,C2 和 C3 为旁路电容,目的是消除晶振起振时产生的电感干扰。对于本开发 板无外接备用电池,如果需要可自行将外部备用电源接入第 8 脚 VCC1。

软件功能实现

数码管上显示电子时钟时分秒,格式为“XX-XX-XX”。
程序框架如下:
(1)编写数码管显示功能
(2)编写 DS1302 时钟读写功能
(3)编写主函数 前面的实验章节都已编写过数码管显示功能,现在对大家来说应该不是问 题,所以本章软件的重点在 DS1302 时序的模拟及数据的读写上。

//ds1302.h
#ifndef __DS1302_H
#define	__DS1302_H#include "public.h"sbit DS1302_RST	=	P3^5;//SPI复位或片选
sbit DS1302_CLK	=	P3^6;//SPI时钟
sbit DS1302_IO	=	P3^4;//SPI数据extern u8 g_ds1302_timer[];//借助外部main定义的时间void DS1302_Init(void);
void DS1302_GetTime(void);
#endif//ds1302.c
#include "ds1302.h"static u8 ds1302_cmd[] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; // 秒分时日月周年的写的指令static void _ds1302_WriteByte(u8 u8cmd, u8 u8data);
static u8 _ds1302_ReadByte(u8 u8cmd);
//复位初始化
void DS1302_Init(void)
{u8 i = 0;_ds1302_WriteByte(0x8E, 0x00); // 写入数据,关闭写保护 指令是1000 1110 delay_ms(10);                  // 延时,确保 DS1302 可以完成初始化for (i = 0; i < 7; i++){_ds1302_WriteByte(ds1302_cmd[i], g_ds1302_timer[i]);}_ds1302_WriteByte(0x8E, 0x80); // 打开写保护。只读不写 这里我感觉可以写成0x8f  没实验
}void DS1302_GetTime(void)
{u8 i;for (i = 0; i < 7; i++){g_ds1302_timer[i] = _ds1302_ReadByte(ds1302_cmd[i] | 1); // 读时钟,读到时钟的低位}
}
static void _ds1302_WriteByte(u8 u8cmd, u8 u8data)
{u8 i = 0;DS1302_RST = 0; // 复位 DS1302 从0到1代表开始_nop_();DS1302_CLK = 0; // 低空闲_nop_();DS1302_RST = 1; // 复位 DS1302_nop_();//高8位for (i = 0; i < 8; i++) // LSB  低位 遍历{DS1302_IO = u8cmd & 0x01;//指令采样u8cmd >>= 1;    // 数据右移 一个个排除低位 从低位获取DS1302_CLK = 1; // 拉高 SCLK  高转低1位数据采样结束_nop_();DS1302_CLK = 0; // 拉低 SCLK_nop_();}for (i = 0; i < 8; i++) // LSB{DS1302_IO = u8data & 0x01; //数据IO采样u8data >>= 1;   // 数据右移DS1302_CLK = 1; // 拉高 SCLK_nop_();DS1302_CLK = 0; // 拉低 SCLK_nop_();}DS1302_RST = 0; // 结束采样复位结束_nop_();
}
// 读一个字节从 DS1302
static u8 _ds1302_ReadByte(u8 u8cmd)
{u8 i = 0;u8 temp;        // 读到的位值u8 u8data = 0;  // 读到的返回值DS1302_RST = 0; // 复位 DS1302 低转高复位成功开始采集_nop_();DS1302_CLK = 0; // 低空闲_nop_();DS1302_RST = 1; // 复位 DS1302_nop_();for (i = 0; i < 8; i++) // LSB{DS1302_IO = u8cmd & 0x01;u8cmd >>= 1;    // 数据右移DS1302_CLK = 1; // 拉高 SCLK 采样_nop_();DS1302_CLK = 0; // 拉低 SCLK_nop_();}for (i = 0; i < 8; i++) // 主机读取8位数据{temp = DS1302_IO; // 读取数据u8data |= (temp << i);DS1302_CLK = 1; // 拉高 SCLK_nop_();DS1302_CLK = 0; // 拉低 SCLK_nop_();}DS1302_RST = 0; // 结束采样_nop_();// 我们的开发板P34有问题,外部没有上拉电阻,需要一个P34的上升沿才能访问到数据DS1302_CLK = 1; // 拉高 SCLK_nop_();DS1302_IO = 0;_nop_();DS1302_IO = 1;_nop_();return u8data;
}//main.c
/*
功能要求:
将DS1302的时-分-秒显示在数码管上。
*/#include "public.h"
#include "smg.h"
#include "ds1302.h"
#include "uart.h"void main(void)
{u8 u8code[8] = {0};u8 i = 0;//计时器SMG_Init();UART_Init();DS1302_Init();while(1){//温度模块i++;if(i == 50)//每秒读一次温度{i = 0;DS1302_GetTime();}//数码管模块u8code[0] = smg_code[g_ds1302_timer[2]/16];//时的十位u8code[1] = smg_code[g_ds1302_timer[2]%16];//时的个位u8code[2] = 0x40;u8code[3] = smg_code[g_ds1302_timer[1]/16];//分的十位u8code[4] = smg_code[g_ds1302_timer[1]%16];//分的个位u8code[5] = 0x40; u8code[6] = smg_code[g_ds1302_timer[0]/16];//秒的十位u8code[7] = smg_code[g_ds1302_timer[0]%16];//秒的个位SMG_Display(u8code);}
}

相关文章:

SPI通信协议

SPI通信协议 简介通信原理通信原理SPI数据通信的流程可以分为以下几步&#xff1a;通信特性设备时钟时钟速率时钟极性跟相位SPI协议层通讯流程详解优点&#xff1a;缺点&#xff1a; DS1302 时钟实验控制寄存器日历、时钟寄存器寄存器说明 DS1302 读写时序软件功能实现 简介 SP…...

vue中如何实现商品多规格添加(后台商城管理系统)

在制作商城类的后台管理系统中会遇到多规格商品的添加&#xff0c;需要向固定的数组内添加&#xff0c;通过查看数据结构正确的向数组中添加数据。 如图&#xff1a; 功能需求&#xff1a;1.每次点击添加新规格时&#xff0c;批量设置会多出来一行表格和一个标题输入框。 最…...

智创 AI 新视界 -- AIGC 重塑广告行业的创新力量(16 - 7)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

Runloop

假设你的项目中有关tableView&#xff0c;然后还有一个定时器timer在执行&#xff0c;定时器代码如下&#xff1a; var num 0override func viewDidLoad() {super.viewDidLoad()let timer Timer(timeInterval: 1,target: self,selector: #selector(self.run),userInfo: nil,r…...

代码随想录第40天

121. 买卖股票的最佳时机 class Solution:def maxProfit(self, prices: List[int]) -> int:cost, profit float(inf), 0for price in prices:cost min(cost, price)profit max(profit, price - cost)return profit122.买卖股票的最佳时机II class Solution:def maxPr…...

element plus table组件多选获取数据id

首先给table加上 selection-change"handleSelectionChange"事件 示例 <el-table selection-change"handleSelectionChange" stripe:data"data?.slice((currentPage3 - 1) * pageSize3, currentPage3 * pageSize3)" style"width: 100%…...

自动驾驶:百年演进

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在…...

STM32 了解OLED

内容扩展 调试方式串口调试&#xff1a;通过串口调试&#xff0c;将调试信息发送到电脑端&#xff0c;电脑使用串口助手显示调试信息 显示屏调试&#xff1a;直接将显示屏连接到单片机&#xff0c;将调试信息打印到显示屏上 keil调试模式&#xff1a;借助Keil软件的调试模式&a…...

NanoLog起步笔记-7-log解压过程初探

nonolog起步笔记-6-log解压过程初探 再看解压过程建立调试工程修改makefile添加新的launch项 注&#xff1a;重新学习nanolog的README.mdPost-Execution Log Decompressor 下面我们尝试了解&#xff0c;解压的过程&#xff0c;是如何得到文件头部的meta信息的。 再看解压过程 …...

python连接redis详细步骤

1.下载并安装windows python Window 平台安装 Python: 以下为在 Window 平台上安装 Python 的简单步骤。 打开 WEB 浏览器访问 Python Releases for Windows | Python.org &#xff1a; 记得勾选 Add Python 3.6 to PATH。 在cmd 执行pip install redis 2.编辑python代码…...

使用redis 的stream 做消息中间件 多线程消费消息

1.redis stream 特点 1.支持消息持久化 2.消费者组模式 3.消息确认机制 4. 消息重试机制 5. 死信队列2. 消息生产者服务 2.1 如下代码Service Slf4j public class StreamMessageProducer {Autowiredprivate StringRedisTemplate redisTemplate;private static final String S…...

《操作系统 - 清华大学》6 -5:局部页面置换算法:最不常用置换算法 (LFU, Least Frequently Used)

文章目录 1. 最不常用算法的工作原理2.最不常用算法特征3. 示例 1. 最不常用算法的工作原理 最不常用算法&#xff1a;注意并不是表示算法本身不常用&#xff0c;而是采取最不常使用页面的策略&#xff0c;Least Frequently Used&#xff0c; LFU。LRU 是最久未被访问的页&…...

GWAS分析先做后学

大家好&#xff0c;我是邓飞。 GWAS分析是生物信息和统计学的交叉学科&#xff0c;上可以学习编程&#xff0c;下可以学习统计。对于Linux系统&#xff0c;R语言&#xff0c;作图&#xff0c;统计学&#xff0c;机器学习等方向&#xff0c;都是一个极好的入门项目。生物信息如…...

【threejs】创建FPS相机

原理说明 控制器是一个很麻烦的东西&#xff0c;需要创建更多的类来管理相机行为&#xff0c;并且可自定义性差&#xff0c;所以将部分控制器的功能绑定到相机上&#xff0c;可以解决这些问题&#xff0c;所以我以 FlyControls为例&#xff0c;将控制器功能绑定到相机上&#…...

路径规划之启发式算法之十一:布谷鸟搜索算法(Cuckoo Search,CS)

布谷鸟搜索算法&#xff08;Cuckoo Search&#xff0c;CS&#xff09;是一种新兴的自然启发式算法&#xff0c;由剑桥大学的杨新社教授和S.戴布&#xff08;Xin-She Yang和Suash Deb&#xff09;于2009年提出。该算法基于布谷鸟的寄生性育雏&#xff08;巢寄生&#xff09;行为…...

Mitel MiCollab企业协作平台存在任意文件读取漏洞(CVE-2024-41713)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

java+springboot+mysql党务(党员)管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的党务管理系统&#xff0c;系统包含管理员、用户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;用户管理&#xff1b;党支部管理&#xff1b;党员管理&#xff08;入党申请、积极分子、发展对象、预备党员、正式…...

gozero项目迁移与新服务器环境配置,包含服务器安装包括go版本,Nginx,项目配置包括Mysql,redis,rabbit,域名

迁移 **GoZero** 项目到新服务器并配置相关环境涉及多个步骤。以下是一个系统化的指南&#xff0c;涵盖服务器环境安装、数据库和缓存配置、项目部署以及域名绑定。 ### 步骤概述 1. **服务器环境配置** - 安装 Go 语言环境 - 安装 Nginx - 安装 MySQL 和 Redis -…...

使用WebDAV来上传和下载文件

WebDAV是什么 基于Web的分布式编写和版本控制&#xff08;WebDAV&#xff09;是超文本传输协议&#xff08;HTTP&#xff09;的扩展&#xff0c;有利于用户间协同编辑和管理存储在万维网服务器文档。WebDAV 由互联网工程任务组的工作组在 RFC 4918 中定义。许多现代操作系统为 …...

集成运算放大电路反馈判断

集成运算放大电路 一种具有很高放大倍数的多级直接耦合放大电路&#xff0c;因最初用于信号运算而得名&#xff0c;简称集成运放或运放 模拟集成电路中的典型组件&#xff0c;是发展最快、品种最多、应用最广的一种 反馈 将放大电路输出信号的一部分或全部通过某种电路引回到输…...

什么是绩效文化?

绩效文化是一种组织文化&#xff0c;它将绩效视为核心价值观&#xff0c;贯穿于组织的各个层面和活动之中。 一、绩效文化的内涵 目标导向 绩效文化强调组织成员都朝着共同的目标努力。这个目标通常是明确、可衡量的&#xff0c;如企业的年度利润目标、市场份额增长目标等。例…...

【力扣】409.最长回文串

问题描述 思路解析 因为同时包含大小写字母&#xff0c;直接创建个ASCII表大小的桶来标记又因为是要回文子串&#xff0c;所以偶数个数的一定可以那么同时&#xff0c;对于出现奇数次数的&#xff0c;我没需要他们的次数-1&#xff0c;变为偶数&#xff0c;并且可以标记出现过…...

android studio创建虚拟机注意事项

emulator 启动模拟器的时候&#xff0c;可以用 AVD 界面&#xff0c;也可以用命令行启动&#xff0c;但命令行启 动的时候要注意&#xff0c;系统有两个 emulator.exe &#xff0c;建议使用 emulator 目录下的那个&#xff01;&#xff01; 创建类型为google APIs的虚拟机可从…...

DP协议:缩略词

缩写代表的含义ACT分配更改触发&#xff08;Allocation Change Trigger&#xff09;API应用程序编程接口&#xff08;Application Programming Interface&#xff09;AUX辅助&#xff08;Auxiliary&#xff09;BER比特错误率&#xff08;Bit Error Rate&#xff09;bpc每色比特…...

【Rive】事件回调

1 前言 Android 中可以通过 RiveAnimationView 的 addEventListener 方法添加动画监听器&#xff0c;用于监听状态动画和过渡动画的开始和结束时机&#xff0c;实现动画开始和结束时的事件回调&#xff1b;也可以监听 Rive 事件触发的时机&#xff0c;在事件触发时响应回调。 …...

YOLOv8-ultralytics-8.2.103部分代码阅读笔记-tuner.py

tuner.py ultralytics\engine\tuner.py 目录 tuner.py 1.所需的库和模块 2.class Tuner: 1.所需的库和模块 # Ultralytics YOLO &#x1f680;, AGPL-3.0 license# 模块提供用于对象检测、实例分割、图像分类、姿势估计和多对象跟踪的 Ultralytics YOLO 模型的超参数调整…...

【数据结构】堆的概念、结构、模拟实现以及应用

本篇我们来介绍一下数据结构中的堆。 1.堆的概念及结构 1&#xff09;堆是一颗完全二叉树。 2&#xff09;堆又分为大堆和小堆&#xff0c;大堆就是树里面任何一个父节点都大于子节点&#xff0c;所以根节点是最大值&#xff1b;小堆就是树里面任何一个父节点都小于子节点&am…...

推送(push)项目到gitlab

文章目录 1、git init1.1、在当前目录中显示隐藏文件&#xff1a;1.2、查看已有的远程仓库1.3、确保你的本地机器已经生成了 SSH 密钥&#xff1a;1.4、将生成的公钥文件&#xff08;通常位于 ~/.ssh/id_rsa.pub&#xff09;复制到 GitLab 的 SSH 设置中&#xff1a;1.5、测试 …...

springboot/ssm宠物商城网站系统Java代码web项目宠物用品购物论坛源码

springboot/ssm宠物商城网站系统Java代码web项目宠物用品购物论坛源码 基于springboot(可改ssm)htmlvue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&…...

前端基础的讲解-JS(22)

什么是JSON&#xff1f; 1.json 是一种轻量级的数据交换格式 简单来说&#xff1a;json 就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互。 类似于&#xff1a; 国际通用语言 - 英语 中国 56 个民族不同地区的通用语言 - 普通话 …...

zerotier实现内网穿透(访问内网服务器)

moo 内网穿透工具 实用工具&#xff1a;zerotier 目录 内网穿透工具 Windows下zerotier安装 ubuntu系统下的zerotier安装 使用moon加速 Windows下zerotier安装 有了网络之后&#xff0c;会给你一个网络id&#xff0c;这个网络id是非常重要的&#xff0c;其它设备要加入…...

python语言中怎么调用不同级文件夹中数据文件

python语言中怎么调用文件夹中数据文件 python 怎么调用同一级文件夹中数据1. **读取同一级文件夹中的数据文件&#xff08;如 .txt, .csv, .json 等&#xff09;**示例&#xff1a; 2. **导入同一级文件夹中的 Python 模块**3. **使用相对路径导入模块**4. **使用 os.path 或 …...

spring事务源码解析

1 引入 在企业级应用开发中&#xff0c;事务管理 是确保数据一致性和完整性的重要手段。而在 Spring 框架中&#xff0c;事务管理提供了高度抽象和灵活的实现&#xff0c;开发者只需通过简单的注解或配置即可轻松实现复杂的事务逻辑。然而&#xff0c;Spring 事务背后的实现机…...

【每日刷题】Day165

【每日刷题】Day165 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 092. 将字符串翻转到单调递增 - 力扣&#xff08;LeetCode&#xff09; 2. 424. 替换后的最长…...

基于51单片机的智能公交车报站系统GPS定位语音播报智能安全检测人数统计

功能描述 1.LCD12864可显示当前年月日&#xff0c;星期&#xff0c;时间&#xff0c; 当前站名&#xff0c;经纬度&#xff0c;是否连接GPS&#xff0c;自动/手动模式&#xff0c; 2.自带GPS定位&#xff0c;可实时显示经纬度&#xff1b; 3.通过DS1302时钟芯片&#xff0c;获…...

计算机网络安全 —— 实体鉴别与生成大随机数

一、实体鉴别# ​ 实体鉴别&#xff08;经常简称为鉴别&#xff09;就是一方验证另一方身份的技术。一个实体可以是人、客户/服务器进程等。这里仅讨论如何鉴别通信对端 实体的身份&#xff0c;即验证正在通信的对方确实是所认为的通信实体&#xff0c;而不是其他的假冒者。进…...

Vue3+Pinia 状态管理持久化

一、Pinia 简介 &#x1f396;️Pinia 起始于 2019 年 11 月左右的一次实验&#xff0c;其目的是设计一个拥有组合式 API 的 Vue 状态管理库。Vue3VitePinia 新三剑客逐渐替代了Vue2WebpackVuex 了&#xff0c;性能啥的各方面吊打。 1.1 什么是状态管理&#xff1f; &#x1f…...

开源项目:轻型图像分割 unet_lite

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…...

C# 向上取整多种实现方法

1.使用 Math.Ceiling 方法&#xff1a; 在 C# 中&#xff0c;可以利用 System.Math 类下的 Math.Ceiling 方法来实现向上取整。它接受一个 double 或 decimal 类型的参数&#xff0c;并返回大于或等于该参数的最小整数&#xff08;以 double 或 decimal 类型表示&#xff09;。…...

Linux 权限及管理

目录 一、Linux权限 1、概念 2、超级用户和普通用户的相关操作 a. 添加用户&#xff0c;删除用户 b. 超级用户和普通用户的切换 c. sduo提权以及白名单设置 二、Linux权限管理 1、文件访问者的分类 2、文件访问类型和权限 a. 文件类型 b. 基本权限 3、文件权限值…...

【JVM】JVM基础教程(一)

目录 初识JVM JVM是什么&#xff1f; JVM的功能 解释、即时编译和运行 内存管理 常见的JVM JVM虚拟机规范 HotSpot的发展历程 JVM的组成 字节码文件详解 应用场景 以正确姿势打开字节码文件 ​编辑字节码文件的组成 基本信息 Magic魔数 主副版本号 常量池 接口…...

企业国内外网络互联方案全解析

面对国内市场日益饱和的现状&#xff0c;企业纷纷将目光投向海外&#xff0c;而实现国内外网络的高效互联&#xff0c;则成为支撑其跨国业务顺利运行的关键。本文将为您详细介绍几种实现国内外网络互联的有效策略&#xff0c;助您轻松应对全球化挑战。 有些企业选择使用虚拟专用…...

【优选算法 位运算】位运算算法入门详解:位运算小专题

判定字符是否唯一 题目解析 算法原理 解法一 &#xff1a;哈希数组 从前往后扫描字符串&#xff0c;把扫描到的字符先进行判断&#xff0c;如果对应的 val 0 &#xff0c;则放入哈希表中&#xff0c;否则返回 false&#xff0c;知道扫描完整个字符&#xff1b;时间…...

大文件分块上传后端服务器

一、背景&#xff1a; 后台系统需要上传大文件、大视频等数据&#xff0c;耗时过长&#xff0c;接口等待超时&#xff0c;故需优化通过前端多线程分片方式进行文件上传&#xff0c;显著提升上传速度。 二、流程&#xff1a; 前端逻辑&#xff1a; 前端使用分片技术&#xff…...

perl Window安装教程

perl Window安装教程 下载地址 https://platform.activestate.com/tangxing806/ActivePerl-5.28/distributions 运行state-remote-installer.exe 按下图截图步骤 检查perl版本 参考文献&#xff1a; perl安装教程...

Scrcpy投影之后为什么声音在电脑端显示?

关于安卓设备和电脑端扬声器优先级 在使用安卓设备与电脑进行某些连接操作&#xff08;比如通过 adb 相关工具交互时&#xff09;&#xff0c;确实存在音频输出的优先级选择情况。通常情况下&#xff0c;可能默认音频会输出到电脑端&#xff08;比如通过投屏等相关操作连接后&…...

2025年山东省职业院校技能大赛“信息安全管理与评估”(山东省) 任务书

2025年山东省职业院校技能大赛“信息安全管理与评估”(山东省 任务书 模块一网络平台搭建与设备安全防护任务1&#xff1a;网络平台搭建 &#xff08;50分&#xff09;任务2&#xff1a;网络安全设备配置与防护&#xff08;250分&#xff09; 模块二网络安全事件响应、数字取证…...

java+ssm+mysql收纳培训网

项目介绍&#xff1a; 使用javassmmysql开发的收纳视频培训网&#xff0c;系统包含超级管理员&#xff0c;系统管理员、培训师、用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;用户管理&#xff08;培训师、用户&#xff09;&#…...

多表查询-概述内连接外连接子查询

一.数据准备&#xff1a; 1.部门表&#xff1a; 代码&#xff1a; -- 部门管理 create table tb_dept (id int unsigned primary key auto_increment comment 主键ID,name varchar(10) not null unique comment 部门名称,create_time datetime not null c…...

H5游戏出海如何获得更多增长机会?

海外H5小游戏的崛起给了国内众多中小厂商出海发展的机会&#xff0c;开发者如何在海外市场获得更多的增长机会&#xff1f;#APP出海# H5游戏如何在海外获得核心用户&#xff1f; HTML5游戏的开发与运营者们首先可以利用量多质高的HTML5游戏&#xff0c;维持海外用户粘性&…...