基于STM32_DS18B20单总线传感器驱动
基于STM32_DS18B20单总线传感器驱动
文章目录
- 基于STM32_DS18B20单总线传感器驱动
- 前言
- 一、BS18B20?
- 二、原理
- 1.复位与检验
- 2.基本命令
- 3.唯一ROM识别码
- 4.温度转换
- 三、驱动代码
- 四、注意事项
前言
本文以一款典型的单总线传感器及其驱动——DS18B20为例,简单对1-Wire总线接口的传感器做个示例讲解,该项目基于硬件平台STM32F407,使用标准库本完成。
一、BS18B20?
DS18B20数字温度计提供9至12位(可配置)温度读数,指示设备的温度。信息通过1-Wire总线接口发送到/从DS18B20,因此只需要从中央微处理器连接到DS18B20的一根线(和接地)。读取、写入和执行温度转换的电源可以从数据线本身获得,而不需要外部电源。每个DS18B20都包含一个唯一的硅序列号,所以多个DS18B20可以存在于同一个1-Wire总线上。这允许在许多不同的地方放置温度传感器。此功能有用的应用包括暖通空调环境控制,感应建筑物,设备或机械内部的温度,以及过程监控和控制。

特点:
1.唯一的1线接口只需要一个端口引脚进行通信
2.多功能简化了分布式温度传感应用
3.不需要外部组件,可从数据线供电。
4.供电范围3.0V至5.5V 零待机电源
5.测量温度范围为-55°C至+125°C。相当于-67°F到+257°F ±0.5°C精度从-10°C到+85°C
6.温度计分辨率可编程从9到12位
二、原理
1.复位与检验
主机发送(TX)复位脉冲(低信号,至少480µs),然后主机释放线路并进入接收模式(RX),线总线通过5k上拉电阻拉到高状态。在检测到DQ引脚上的上升沿后,DS18B20等待15-60µs,然后发送存在脉冲(60-240µs的低电平信号),主机在该时段检测到DQ的低电平信号,表示DS18B20设备存在,否则设备不存在。参见驱动中:void DS18B20_Reset(void)和uint8_t DS18B20_Check(void)函数。

2.基本命令
DS18B20常见的命令及含义如表所示:
| 名称 | 命令码 | 功能 |
|---|---|---|
| Read ROM | 33h | 该命令允许总线主机读取DS18B20的8位族码、唯一的48位序列号和8位CRC。该命令只能在总线上有单个DS18B20时使用。如果总线上有多个从站,当所有从站试图同时传输时,就会发生数据冲突(open drain将产生有线AND结果)。 |
| Match ROM | 55h | match ROM命令,后跟64位ROM序列,允许总线主机在多路总线上寻址特定的DS18B20。只有与64位ROM序列完全匹配的DS18B20才会响应以下内存功能命令。所有与64位ROM序列不匹配的从存储器将等待复位脉冲。该命令可用于总线上的单个或多个设备。 |
| Skip ROM | CCh | 该命令允许总线主机在不提供64位ROM代码的情况下访问内存功能,从而在单丢总线系统中节省时间。如果总线上有一个以上的从站,并且在Skip ROM命令之后发出了Read命令,那么当多个从站同时传输时,总线上就会发生数据冲突(open drain下拉将产生一个有线and结果)。相当于跳过了识别码查验,直接读取温度 |
| Search ROM | F0h | 当系统最初启动时,总线主机可能不知道1-Wire总线上的设备数量或它们的64位ROM代码。搜索ROM命令允许总线主人使用消除过程来识别总线上所有从设备的64位ROM代码。 |
| Read Scratchpad | BEh | 该命令读取刮记本的内容。读取将从字节0开始,并将继续通过刮擦板,直到读取第九个(字节8,CRC)字节。如果不是所有的位置都要读取,主机可以在任何时候发出复位以终止读取。 |
| Search ROM | 44h | 该命令开始温度转换。无需进一步收集数据。温度转换将被执行,然后DS18B20将保持空闲。如果总线主机按照该命令发出读时隙,只要DS18B20忙于进行温度转换,它就会在总线上输出0;当温度转换完成时,它将返回一个1。如果parasitepowered,总线主必须在发出该命令后立即启用一个大于tconv的强上拉。 |
基本操作过程参见官方手册给出的如下流程图

3.唯一ROM识别码
每个DS18B20包含一个64位长的唯一ROM代码。发送0x33命令后可读取改64位识别码,前8位是1-Wire族代码(DS18B20代码为28h)。接下来的48位是唯一的序列号。最后8位是前56位的CRC(CRC = X8 + X5 + X4 + 1),(参见图4)。当有多个DS18B20设备同时挂在1-Wire总线下时,可通过发送0x55匹配命令后发送识别码来匹配ROM识别码来确定控制或读取哪一个DS18B20设备数据。以前的方式是先准确无误得读取每个DS18B20设备唯一ROM识别码并提前写入代码中,如果某个传感器设备损坏,更换传感器设备的同时要更改代码或识别码配置文件。后来手册中给出一个Search ROM命令(暂时没试过)。

4.温度转换
DS18B20的核心功能是其直接数字温度传感器。DS18B20的分辨率是可配置的(9,10,11或12位),12位读数为出厂默认状态。这相当于0.5°C, 0.25°C, 0.125°C或0.0625°C的温度分辨率。在发出Convert T [44h]命令后,执行温度转换,热数据以16位扩展符号的二进制补码格式存储在刮板存储器中。一旦转换完成,可以通过发出Read Scratchpad [BEh]命令在1-Wire接口上检索温度信息。数据通过1-Wire总线传输,首先是LSB总线。温度寄存器的MSB包含“符号”(S)位,表示温度是正的还是负的。表2描述了输出数据与测量温度的确切关系。该表采用12位分辨率。转换方式参见驱动void DS18B20_GetTemp_Main(void)函数。

三、驱动代码
.h文件:
#ifndef __DS18B20_H
#define __DS18B20_H#include "stdio.h"
#include "Config.h"
#include "SysTick.h"/********************************************DS18B20 devier********************************************/
#define DS18B20_IS_READY (1u) //设备存在
#define DS18B20_NOT_READY (0u) //设备不存在#define DS18B20_DQ_IN() {GPIOG->MODER&=~(3<<(9*2));GPIOG->MODER|=0<<9*2;} //PG9 输入模式
#define DS18B20_DQ_OUT() {GPIOG->MODER&=~(3<<(9*2));GPIOG->MODER|=1<<9*2;} //PG9 输出模式#define DS18B20_DQ_PORT GPIOG
#define DS18B20_DQ_PIN GPIO_Pin_9#define DS18B20_WAIT_TIMEOUT (uint8_t)240 //等待时间
#define DS18B20_DELAY (uint8_t)5 //延时时间#define DS18B20_DQ_LOW GPIO_ResetBits(DS18B20_DQ_PORT,DS18B20_DQ_PIN) //为设置低电平
#define DS18B20_DQ_HIGH GPIO_SetBits(DS18B20_DQ_PORT,DS18B20_DQ_PIN) //设置为高电平 #define DS18B20_DQ_STATUS GPIO_ReadInputDataBit(DS18B20_DQ_PORT,DS18B20_DQ_PIN) //读取DQ状态#define DS18B20_delay_us(a) SysCtlDelayus(a) //延时函数ustypedef enum
{DS18B20_1 = 0,DS18B20_2,DS18B20_3,DS18B20_4,DS18B20_Num_Counter
}DS18B20_Num;/*DS18B20_SerialNumber
------------------------------------------------------------------------------------
| 8-BIT CRC CODE | 48-BIT SERIAL NUMBER | 8-BIT FAMILY CODE(28h) |
------------------------------------------------------------------------------------
MSB LSB MSB LSB MSB LSB
*/
typedef struct
{uint8_t DS18B20_IndexNumber; //设备编号uint8_t DS18B20_SerialNumber[8]; //ROM唯一识别码short DS18B20_Temperature; //温度数据
}DS18B20_ATTRIB_Type;extern uint8_t DS18B20_Init(void);
extern void DS18B20_Reset(void);
extern short DS18B20_Get_Temperature(uint8_t Index_Num);
extern void DS18B20_GetTemp_Main(void);#endif
.c文件:
#include "DS18B20_Dev.h"//#define DS18B20_MORE_THAN_ONE static DS18B20_ATTRIB_Type DS18B20_Temp[DS18B20_Num_Counter] = {{DS18B20_1,{0x08,0x22,0x70,0xB0,0x9C,0x87,0x28},0u},{DS18B20_2,{0x00,0x00,0x00,0x00,0x00,0x00,0x00},0u},{DS18B20_3,{0x00,0x00,0x00,0x00,0x00,0x00,0x00},0u},{DS18B20_4,{0x00,0x00,0x00,0x00,0x00,0x00,0x00},0u}, };static uint8_t DS18B20_Check(void);
static uint8_t DS18B20_Read_Bit(void);
static uint8_t DS18B20_Read_Byte(void);
static void DS18B20_Write_Byte(uint8_t aByte);
static uint8_t DS18B20_Get_RomID(uint8_t *ID_Buffer);/************************************************************************************
*@fuction :DS18B20_Init
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
extern uint8_t DS18B20_Init(void)
{DS18B20_Reset();if(DS18B20_Check() == DS18B20_IS_READY){#ifdef DS18B20_MORE_THAN_ONEDS18B20_Get_RomID(DS18B20_Temp[0].DS18B20_SerialNumber);#elsereturn DS18B20_IS_READY;#endif}
}/************************************************************************************
*@fuction :DS18B20_Start
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
void DS18B20_Start(void)
{DS18B20_Reset(); if(DS18B20_Check() == DS18B20_IS_READY) {DS18B20_Write_Byte(0xCC); //skip romDS18B20_Write_Byte(0x44); //convert}else{//error}
}/************************************************************************************
*@fuction :DS18B20_Reset
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
void DS18B20_Reset(void)
{//DS18B20 复位时序:DQ输出模式 DQ = 0(750us), DQ = 0(20us.DS18B20_DQ_OUT();DS18B20_DQ_LOW;DS18B20_delay_us(750);DS18B20_DQ_HIGH;DS18B20_delay_us(15);
}/************************************************************************************
*@fuction :DS18B20_Check
*@brief :
*@param :--
*@return :1-device ok/0-device error
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
uint8_t DS18B20_Check(void)
{uint8_t wait_time = 0;uint8_t Ready_Dev = 0;//DQ输入模式DS18B20_DQ_IN();//等待DQ脚被DS18B20拉低while((DS18B20_DQ_STATUS) && (wait_time < DS18B20_WAIT_TIMEOUT)){wait_time++;DS18B20_delay_us(1);}if(wait_time >= DS18B20_WAIT_TIMEOUT){//如果等待时间超时,则退出等待return (uint8_t)DS18B20_NOT_READY;}else{//等待DQ脚被DS18B20抬高wait_time = 0;while((!DS18B20_DQ_STATUS) && (wait_time < DS18B20_WAIT_TIMEOUT)){wait_time++;DS18B20_delay_us(1);}if(wait_time >= DS18B20_WAIT_TIMEOUT){//如果等待时间超时,则退出等待return (uint8_t)DS18B20_NOT_READY;}else{//如果未超时,则说明设备存在return (uint8_t)DS18B20_IS_READY; }}
}/************************************************************************************
*@fuction :DS18B20_Write_Byte
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
static void DS18B20_Write_Byte(uint8_t aByte)
{ uint8_t i = 0;uint8_t temp = 0;//将DQ设置为输出模式DS18B20_DQ_OUT();for(i = 0;i < 8;i++){temp = aByte&0x01;aByte = aByte>>1;if(temp){ //最低位为1DS18B20_DQ_LOW;DS18B20_delay_us(2);DS18B20_DQ_HIGH;DS18B20_delay_us(60); }else{ //最低位为0DS18B20_DQ_LOW;DS18B20_delay_us(60);DS18B20_DQ_HIGH;DS18B20_delay_us(2);} }
}/************************************************************************************
*@fuction :DS18B20_Read_Bit
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
static uint8_t DS18B20_Read_Bit(void) //read one bit
{uint8_t Bit_Status;DS18B20_DQ_OUT(); //SET PG9 OUTPUTDS18B20_DQ_LOW; DS18B20_delay_us(2);DS18B20_DQ_HIGH; DS18B20_DQ_IN(); //SET PG9 INPUTDS18B20_delay_us(12); if(DS18B20_DQ_STATUS){Bit_Status = 1;}else{ Bit_Status = 0;} DS18B20_delay_us(50);return Bit_Status;
}
/************************************************************************************
*@fuction :DS18B20_Read_Byte
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
static uint8_t DS18B20_Read_Byte(void)
{uint8_t i = 0 ,Bit_Status = 0,aByte = 0;//DQ为输入模式DS18B20_DQ_IN();for (i = 0; i < 8; i++){//低位先出Bit_Status = DS18B20_Read_Bit();aByte = (Bit_Status << 7) | (aByte >> 1);}return aByte;
}/************************************************************************************
*@fuction :DS18B20_Read_Byte
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
static uint8_t DS18B20_Get_RomID(uint8_t *ID_Buffer)
{//uint8_t RomID[8];uint8_t i = 0;//DS18B20_Start(); // ds1820 start convertDS18B20_Reset();DS18B20_Check(); DS18B20_Write_Byte(0x33); // skip rom//SDA为输入模式DS18B20_DQ_IN();for (i = 0; i < 8; i++){ID_Buffer[i] = DS18B20_Read_Byte();}//return aByte;
}/************************************************************************************
*@fuction :DS18B20_GetTemp_Main
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
void DS18B20_GetTemp_Main(void)
{uint8_t temp;uint8_t TL,TH;short Temperature;DS18B20_Start(); // ds1820 start convertDS18B20_Reset();DS18B20_Check(); DS18B20_Write_Byte(0xCC); // skip romDS18B20_Write_Byte(0xBE); // read TL = DS18B20_Read_Byte(); // LSB TH = DS18B20_Read_Byte(); // MSB if(TH > 7){TH = ~TH;TL = ~TL; temp = 0; //温度为负 }else{ temp = 1; //温度为正} Temperature = TH; //获得高八位Temperature <<= 8; Temperature += TL; //获得低八位Temperature = (double)Temperature * 0.625; //转换 if(temp){DS18B20_Temp[0].DS18B20_Temperature = Temperature; //返回温度值}else {DS18B20_Temp[0].DS18B20_Temperature = -Temperature;}
}/************************************************************************************
*@fuction :DS18B20_Get_Temperature
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
extern short DS18B20_Get_Temperature(uint8_t Index)
{return DS18B20_Temp[0].DS18B20_Temperature;
}
四、注意事项
1.硬件电路中DQ脚外部会加上拉电阻,主机释放总线会被上拉电阻自动上拉,但为保险器件我们将主机释放中线写为主动上拉为高电平
2. .h文件中对延时函数DS18B20_delay_us(a)的定义,关于 SysCtlDelayus(a)实际是ARM汇编的一种延时函数的写法,参见另一篇关于延时函数的博客(汇编延时)https://blog.csdn.net/Yin_w/article/details/130036593?spm=1001.2014.3001.5501
相关文章:
基于STM32_DS18B20单总线传感器驱动
基于STM32_DS18B20单总线传感器驱动 文章目录 基于STM32_DS18B20单总线传感器驱动前言一、BS18B20?二、原理1.复位与检验2.基本命令3.唯一ROM识别码4.温度转换 三、驱动代码四、注意事项 前言 本文以一款典型的单总线传感器及其驱动——DS18B20为例,简单…...
目标识别项目实战:基于Yolov7-LPRNet的动态车牌目标识别算法模型(三)
前言 目标识别如今以及迭代了这么多年,普遍受大家认可和欢迎的目标识别框架就是YOLO了。按照官方描述,YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性…...
springboot线程池创建与使用
/*** author: zcs* Title: TaskPoolConfig* Description: 线程池配置* date: 2023/10/11 17:52*/ Component public class TaskPoolConfig {Bean(name "threadPoolTaskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor taskExecutor new ThreadP…...
UDP和TCP特点(部分)对比:
传输层的两个主要协议:TCP 和 UDP UDP和TCP特点(部分)对比: UDP:无连接, 不可靠传输, 面向数据报, 全双工。 TCP:有连接, 可靠传输, 面向字节流…...
PostMan环境变量、全局变量、动态参数使用
一、环境准备 postmanmoco [{"description": "登录认证","request": {"uri": "/login","method": "post","forms": {"user": "admin","password": "a123…...
服务器数据恢复-服务器硬盘指示灯黄灯闪烁的数据恢复案例
服务器数据恢复环境: 服务器面板上的硬盘指示灯显示黄色是一种警告,提示指示灯对应的服务器硬盘已经被服务器识别出存在故障,硬盘即将下线。如果出现这种情况,建议服务器管理员/运维人员及时用完好的硬盘替换显示黄色指示灯对应的…...
ts 分发
在 TypeScript 中,"分发"(distributive)是指在条件类型中的联合类型上自动进行类型推断的机制。当使用条件类型操作联合类型时,TypeScript 会自动将联合类型中的每个成员都应用该条件类型。 下面是一个示例:…...
SQL中的group by使用注意事项
在 SQL 中,GROUP BY 语句用于将查询结果按照指定的列进行分组,并对每个分组计算聚合函数(如 SUM、AVG、COUNT 等)的值。一般情况下,如果查询中包含聚合函数,那么就需要使用 GROUP BY 语句将查询结果按照指定…...
矩阵剪辑系统源码----pc/手机端双开发
剪辑系统,剪辑矩阵系统,剪辑矩阵系统主要是针对抖音、快手、bili平台的一个工具,今天就来给大家交流一下这 个产品的主要功能以及构成。剪辑矩阵系统,矩阵剪辑系统源码-这产品主要功能就是一个视频剪辑功能,这个视频剪…...
0基础学习VR全景平台篇 第106篇:认识调色软件Lightroom
上课!全体起立~ 大家好,欢迎观看蛙色官方系列全景摄影课程! 正式开讲之前需要先引出一个概念:到底什么是调色? 比如说上面这张照片,你可能会具体的指出照片中的元素有天空、山脉、草地等…… 如果我们跳出我们的固…...
React如何优化减少组件间的重新Render
目前写了不少React的项目,发现React有些特点更灵活和注重细节,很多东西需要有一定的内功才能掌握好;比如在项目中常常遇到的组件重复渲染,有时候组件重复渲染如果内容是纯文本,不打印日志就不容易发现重复渲染了&#…...
mysql面试题44:MySQL数据库cpu飙升的话,要怎么处理?
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL数据库cpu飙升的话,要怎么处理呢? 当MySQL数据库的CPU使用率飙升时,可能表示数据库负载过重或存在性能问题。以下是处理MySQL数据库CPU飙…...
动画圆圈文字标志效果
效果展示 CSS 知识点 实现圆圈文字animation 属性回顾 实现思路 从效果的实现思路很简单,其实就是两个圆圈就可以实现。外层大圆(灰色)用于圆圈文字的展示,而内圆(藏青色)主要用于存放 Logo 图片。布局采…...
【数据结构】二叉树--顺序结构及实现 (堆)
目录 一 二叉树的顺序结构 二 堆的概念及结构 三 堆的实现 1 包含所有接口 (Heap.h) 2 初始化,销毁和交换(Heap.c) 3 向上调整(Heap.c) 4 插入(Heap.c) 5 向下调整(Heap.c) 6 删除(Heap.c) 7 打印&#…...
适用于嵌入式单片机的差分升级通用库
转至:痞子衡嵌入式半月刊:第 81 期 1、mcu_bsdiff_upgrade - 适用于嵌入式单片机的差分升级通用库 mcu_bsdiff_upgrade 是一款适用于嵌入式单片机的差分升级库,通用所有单片机,如stm32、华大、复旦微、瑞萨等。适合嵌入式的差分升…...
Exposure Normalization and Compensation for Multiple-Exposure Correction 论文阅读笔记
这是CVPR2022的一篇曝光校正的文章,是中科大的。一作作者按同样的思路(现有方法加一个自己设计的即插即用模块以提高性能的思路)在CVPR2023也发了一篇文章,名字是Learning Sample Relationship for Exposure Correction。 文章的…...
Arduino驱动BMI160 6轴惯性运动传感器(惯性测量传感器篇)
目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序...
数据挖掘实战(3):如何对比特币走势进行预测?
⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…...
巴以冲突中暴露的摄像头正对安全构成威胁
巴以冲突爆发后,许多配置不当的安全摄像头正暴露给黑客活动分子,使其周遭人员面临巨大安全风险。 Cybernews 研究人员发现,在以色列至少有165 个暴露的联网 RTSP 摄像头,在巴勒斯坦有 29 个暴露的 RTSP 摄像头。在巴勒斯坦&am…...
【Redis】Redis性能优化:理解与使用Redis Pipeline
原创不易,注重版权。转载请注明原作者和原文链接 文章目录 Pipeline介绍原生批命令(MSET, MGET) VS PipelinePipeline的优缺点一些疑问Pipeline代码实现 当我们谈论Redis数据处理和存储的优化方法时,「 Redis Pipeline」无疑是一个不能忽视的重要技术。…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
