通用性I2C接口的应用之驱动SHT20(N32G45XVL-STB)

目录

概述

1 软硬件接口

1.1 MCU与SHT20接口

 1.2 开发软硬件信息

1.3 SHT-20模块电路

2 I2C软件接口实现

2.1 MCU相关接口

2.2 软件接口实现

2.3 初始化struct I2C 

3  SHT20驱动程序实现

3.1 SHT20驱动调用I2C接口

​3.2 驱动源代码文件

4 测试

4.1 测试代码实现

4.2 运行程序


源代码下载地址:

通用性I2C接口的应用之驱动SHT20(N32G45XVL-STB)资源-CSDN文库

概述

本文主要介绍使用通用性I2C接口的驱动SHT20 sensor,文中介绍了如何初始化I2C port。笔者使用N32G45XVL-STB板卡作为主控。文中介绍了IO的配置方法。还介绍了device驱动中如何调用i2c的接口。最后设计一个测试程序以验证驱动是否能够正常工作。

1 软硬件接口

1.1 MCU与SHT20接口

MCU接口SHT20功能
PB6SDAI2C数据端口
PB7SCLI2C时钟接口

 1.2 开发软硬件信息

软硬件信息版本信息
N32G45x MCUN32G457VEL7
KeilMDK ARM 5.38
调试工具:CMSIS-DAPNS-LINK

1.3 SHT-20模块电路

1)SHT20硬件接口图

2) sensor模块电路

2 I2C软件接口实现

2.1 MCU相关接口

在i2c_master.c文件中,和i2c相关的接口函数 已经实现出来了。在使用这些接口之前,struct I2C中的数据结构必须被初始化,这样接口函数才能调用struct I2C中的函数参数,例如:

I2C stru_Sht2xDrv;// 初始化函数接口
void i2c_Sht2xDrvRegisterPort(void)
{stru_Sht2xDrv.IIC_InitPort = i2c_init_port;stru_Sht2xDrv.IIC_READ_SCL = i2c_SCL_READ;stru_Sht2xDrv.IIC_READ_SCL = i2c_SDA_READ;stru_Sht2xDrv.IIC_SCL_H = set_i2c_scl_1;stru_Sht2xDrv.IIC_SCL_L = set_i2c_scl_0;stru_Sht2xDrv.IIC_SDA_H = set_i2c_sda_1;stru_Sht2xDrv.IIC_SDA_L = set_i2c_sda_0;
}// 调用方法
static void demo_WriteRegister(uint8_t val,  uint8_t reg)
{  i2c_master_Start(&stru_Sht2xDrv);i2c_master_SendByte( &stru_Sht2xDrv, DEMO_ADDRESS );   //Slave address,SA0=0   i2c_master_WaitAck( &stru_OledDrv );i2c_master_SendByte( &stru_Sht2xDrv, reg );            //write register i2c_master_WaitAck( &stru_Sht2xDrv);i2c_master_SendByte( &stru_Sht2xDrv, val ); i2c_master_WaitAck( &stru_Sht2xDrv);i2c_master_Stop( &stru_Sht2xDrv);    
}

 struct I2C的定义如下:

2.2 软件接口实现

1)IO相关的端口定义

在项目文件中,创建一个sht2x_port.c文件,在该文件中实现和MCU IO相关的接口

代码第23行: 定义总线时钟接口

代码第25行:定义GPIO Port

代码第26行:SCL 对应的pin

代码第27行:SDA对应的pin

代码第29~30行:SCL Pin电平变化定义

代码第32~33行:SDA Pin电平变化定义

2) MCU IO端口初始化

代码第36行:定义I2C数据结构

代码第41~54行:初始化I2C接口对应的两个IO

 3) 读pin电平函数

代码第57~74行: 读SDA pin电平

代码第76~93行: 读SCL pin电平

 4) 设置SCL和SDA电平引脚函数

2.3 初始化struct I2C 

在完成I2C要求的函数定义之后,就可以初始化struct I2C ,其具体方法如下:

3  SHT20驱动程序实现

3.1 SHT20驱动调用I2C接口

在文件sht2x_port.c文件中已经定义了数据结构I2C stru_Sht2xDrv, 那么在其驱动文件sht2x.c只需调用该数据结构即可。

代码第365行: 初始化i2c 端口

代码第248行: 调用i2c_master_Start

代码第249行: 调用i2c_master_SendByte,发送一个byte

代码第249行: 调用i2c_master_WaitAck

3.2 驱动源代码文件

1)创建sht2x.c文件,编写如下代码:

/** \file$Id: sht2x.c 40486 2018-08-12 13:50:21Z tangmingfei2013@126.com $Copyright (c)tangmingfei2013@126.com Holding B.V.
All Rights Reserved.This source code and any compilation or derivative thereof is the proprietary
information of mingfei.tang Lighting Holding B.V. and is confidential in nature.
Under no circumstances is this software to be combined with any
Open Source Software in any way or placed under an Open Source License
of any type without the express written permission of mingfei.tang Holding B.V.
*//*******************************************************************************
* EXPORT INCLUDE FILES
*******************************************************************************/
#include "sht2x_port.h"
#include "sht2x.h"/******************************************************************************
* LOCAL MACROS AND DEFINITIONS
******************************************************************************/
#define i2c_master_ADDRESS          (0x40 << 1)
#define POLY                        0x131;       //P(x)=x^8+x^5+x^4+1 = 100110001#define DELAY_CNT                   4500          //for N32G45, sleep time is 6.4 ms static shtOpt s_ShtOpt;
/******************************************************************************
* LOCAL FUNCTION DECLARATIONS
******************************************************************************/
static void i2c_master_Delay(uint16_t value );
static uint8_t sht2xdrv_CheckCrc(uint8_t data[], uint8_t nbrOfBytes, uint8_t checksum);
static uint8_t sht2xdrv_CheckOk(void);
static int32_t sht2xdrv_CalcTemperatureC(uint16_t u16sT);
static int32_t sht2xdrv_CalcRH(uint16_t u16sRH);static void i2c_master_Delay(uint16_t value )
{uint16_t i;for (i = 0; i < value; i++);
}static uint8_t sht2xdrv_CheckCrc(uint8_t data[], uint8_t nbrOfBytes, uint8_t checksum)
{uint8_t res = 0;uint8_t crc = 0;uint8_t byteCtr;//calculates 8-Bit checksum with given polynomialfor (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr){crc ^= (data[byteCtr]);for (uint8_t bit = 8; bit > 0; --bit){if (crc & 0x80){crc = (crc << 1) ^ POLY;}else{crc = (crc << 1);}}}if (crc != checksum){res = 1;}return res;
}static uint8_t sht2xdrv_CheckOk(void)
{if (i2c_master_CheckDevice(&stru_Sht2xDrv, i2c_master_ADDRESS ) == 0){/* sensor is online*/return 1;}else{/* fail: send stop */i2c_master_Stop( &stru_Sht2xDrv );return 0;}
}static uint8_t sht2xdrv_ReadUserRegister( uint8_t *pRegisterValue )
{uint8_t ret = SHT2x_STATUS_OK;uint8_t cmd = USER_REG_R;// write address i2c_master_Start( &stru_Sht2xDrv );i2c_master_SendByte( &stru_Sht2xDrv, i2c_master_ADDRESS | I2C_MATER_W );  // Device address if (i2c_master_WaitAck(&stru_Sht2xDrv) != 0){goto cmd_fail;}i2c_master_SendByte( &stru_Sht2xDrv, cmd);if (i2c_master_WaitAck( &stru_Sht2xDrv ) != 0){goto cmd_fail;}//Read register value i2c_master_Start( &stru_Sht2xDrv );i2c_master_SendByte( &stru_Sht2xDrv, i2c_master_ADDRESS | I2C_MATER_R);if (i2c_master_WaitAck( &stru_Sht2xDrv ) != 0){goto cmd_fail;} *pRegisterValue = i2c_master_ReadByte( &stru_Sht2xDrv );i2c_master_NAck( &stru_Sht2xDrv );i2c_master_Stop( &stru_Sht2xDrv );return ret;cmd_fail:    i2c_master_Stop( &stru_Sht2xDrv );ret = SHT2x_STATUS_ERR_BAD_DATA;return ret;
}static int32_t sht2xdrv_CalcTemperatureC(uint16_t u16sT)
{int32_t temperatureC;       // variable for resultu16sT &= ~0x0003;           // clear bits [1..0] (status bits)/** Formula T = -46.85 + 175.72 * ST / 2^16 from data sheet 6.2,* optimized for integer fixed point (3 digits) arithmetic*/temperatureC = (((uint32_t)17572 * u16sT) >> 16) - 4685;return (int32_t)temperatureC;
}static int32_t sht2xdrv_CalcRH(uint16_t u16sRH)
{uint32_t humidityRH;       // variable for resultu16sRH &= ~0x0003;          // clear bits [1..0] (status bits)/** Formula RH = -6 + 125 * SRH / 2^16 from data sheet 6.1,* optimized for integer fixed point (3 digits) arithmetic*/humidityRH = (((uint32_t)12500 * u16sRH) >> 16) - 600;return (int32_t)humidityRH;
}uint8_t  sht2xdrv_ResetSht2x( void )
{uint8_t ret = SHT2x_STATUS_OK;uint8_t cmd = SOFT_RESET;i2c_master_Start( &stru_Sht2xDrv );i2c_master_SendByte( &stru_Sht2xDrv, i2c_master_ADDRESS | I2C_MATER_W );  // Device address if (i2c_master_WaitAck( &stru_Sht2xDrv ) != 0){goto cmd_fail;}i2c_master_SendByte(&stru_Sht2xDrv, cmd);if (i2c_master_WaitAck( &stru_Sht2xDrv ) != 0){goto cmd_fail;}cmd_fail: i2c_master_Stop( &stru_Sht2xDrv );ret = SHT2x_STATUS_ERR_TIMEOUT;return ret;
}uint8_t  sht2xdrv_GetBatteryStatus(void)
{uint8_t reg;uint8_t error = SHT2x_STATUS_OK;error = sht2xdrv_ReadUserRegister(&reg);if (error != SHT2x_STATUS_OK){return error;}return (reg & 0x40);
}uint8_t sht2xdrv_GetHeaterStatus(void)
{uint8_t reg;uint8_t error = SHT2x_STATUS_OK;error = sht2xdrv_ReadUserRegister(&reg);if (error != SHT2x_STATUS_OK){return error;}return (reg & 0x04);
}uint8_t sht2xdrv_GetResolution(sht2xResolution_t *pResolution)
{uint8_t error = SHT2x_STATUS_OK;uint8_t reg = 0;error = sht2xdrv_ReadUserRegister(&reg);if (error != SHT2x_STATUS_OK){return error;}*pResolution = (sht2xResolution_t)(reg & SHT2x_RES_MASK);return error;
}static void sht2xdrv_readVal(uint8_t cmd, shtdrv *pShtdrv )
{uint8_t checksum;                   //checksumuint8_t data[3] = {0, 0, 0};        //data array for checksum vuint8_t cmd_fail = 0;if(  pShtdrv->finish )return;pShtdrv->ret = SHT2x_STATUS_ERR_BAD_DATA;switch( pShtdrv->_step ){default:case 0:i2c_master_Start( &stru_Sht2xDrv );i2c_master_SendByte( &stru_Sht2xDrv, i2c_master_ADDRESS | I2C_MATER_W );  // Device address if (i2c_master_WaitAck( &stru_Sht2xDrv ) != 0){cmd_fail = 1;break;}pShtdrv->_step = 1;break;case 1:// send command and prepare to reading data value i2c_master_SendByte( &stru_Sht2xDrv, cmd);if (i2c_master_WaitAck( &stru_Sht2xDrv ) != 0){cmd_fail = 1;break;}pShtdrv->_step = 2;pShtdrv->_tryCnt = 0;break;case 2:// set the address for reading data i2c_master_Start( &stru_Sht2xDrv );i2c_master_SendByte( &stru_Sht2xDrv, i2c_master_ADDRESS | I2C_MATER_R);if (i2c_master_WaitAck( &stru_Sht2xDrv ) != 0){pShtdrv->_tryCnt ++;if( pShtdrv->_tryCnt > 10 ){cmd_fail = 1;break;}}pShtdrv->_step = 3;pShtdrv->_tryCnt = 0;break;case 3:// Notes: convert time must >= 4 ms i2c_master_Delay( 3 );pShtdrv->_tryCnt ++;if( pShtdrv->_tryCnt > 4500 ){pShtdrv->_tryCnt = 0;pShtdrv->_step = 4;}break;case 4:// read sensor's datadata[0] = i2c_master_ReadByte( &stru_Sht2xDrv );i2c_master_Ack( &stru_Sht2xDrv );data[1] = i2c_master_ReadByte( &stru_Sht2xDrv );i2c_master_Ack( &stru_Sht2xDrv );data[2] = i2c_master_ReadByte( &stru_Sht2xDrv );i2c_master_NAck( &stru_Sht2xDrv );i2c_master_Stop( &stru_Sht2xDrv );checksum = data[2];pShtdrv->ret = sht2xdrv_CheckCrc(data, 2, checksum);if ( pShtdrv->ret != SHT2x_STATUS_OK){pShtdrv->_step = 2;break;}pShtdrv->_binValue = ((uint16_t)data[0] << 8) | data[1];pShtdrv->_step = 0;pShtdrv->finish = 1;break;}if( cmd_fail ){pShtdrv->finish = 1;pShtdrv->_tryCnt =0;pShtdrv->_step = 0;pShtdrv->ret = SHT2x_STATUS_ERR_BAD_DATA;i2c_master_Stop( &stru_Sht2xDrv );}
}static void sht2xdrv_readTempOrRH(  uint8_t cmd, shtdrv *pShtdrv )
{switch( cmd ){case  TRIG_T_MEASUREMENT_HM:sht2xdrv_readVal(cmd, pShtdrv);if( pShtdrv->ret == SHT2x_STATUS_OK){pShtdrv->outValue = sht2xdrv_CalcTemperatureC( pShtdrv->_binValue );pShtdrv->dataValid = 1;}break;case  TRIG_RH_MEASUREMENT_POLL:sht2xdrv_readVal(cmd, pShtdrv);if( pShtdrv->ret == SHT2x_STATUS_OK){pShtdrv->outValue = sht2xdrv_CalcRH( pShtdrv->_binValue );pShtdrv->dataValid = 1;}break;}
}static void _sht2xdrv_Init( shtOpt *pshtOpt )
{sht2xResolution_t sht2xResolutionvalue;stru_Sht2xDrv.IIC_InitPort();uint8_t _res = sht2xdrv_CheckOk();if( _res ){sht2xdrv_ResetSht2x();sht2xdrv_GetBatteryStatus();sht2xdrv_GetResolution( &sht2xResolutionvalue );return;}pshtOpt->errorCode |= SHT2x_RES_ERR;
}/******************************************************************************
* EXPORTED FUNCTIONS
******************************************************************************/
void sht2xdrv_Init( void )
{_sht2xdrv_Init( &s_ShtOpt );
}shtOpt *sht2xdrv_getResult( void )
{return &s_ShtOpt;
}void sht2xdrv_ClearReadFlag( shtdrv *pShtdrv )
{pShtdrv->dataValid = 0;
}void sht2xdrv_readValue( shtOpt *pshtOpt )
{static uint8_t _step = TRIG_T_MEASUREMENT_HM;shtdrv *pTempData = &pshtOpt->st_Temp;shtdrv *pRhData = &pshtOpt->st_RH;if( pshtOpt ->errorCode & SHT2x_RES_ERR )return;switch ( _step ){default:case TRIG_T_MEASUREMENT_HM:sht2xdrv_readTempOrRH( TRIG_T_MEASUREMENT_HM,pTempData );if( pTempData->finish ){_step = TRIG_RH_MEASUREMENT_POLL;pTempData->finish  = 0;}break;case TRIG_RH_MEASUREMENT_POLL:sht2xdrv_readTempOrRH( TRIG_RH_MEASUREMENT_POLL, pRhData);if( pRhData->finish ){_step = TRIG_T_MEASUREMENT_HM;pRhData->finish  = 0;}break;}
}void SHT2X_test( void )
{sht2xdrv_readValue( &s_ShtOpt );
}/* End of this file */

2) 创建sht2x.h文件,编写如下代码:

/** \file$Id: sht2x.h 40486 2018-08-12 13:50:21Z tangmingfei2013@126.com $Copyright (c)tangmingfei2013@126.com Holding B.V.
All Rights Reserved.This source code and any compilation or derivative thereof is the proprietary
information of mingfei.tang Lighting Holding B.V. and is confidential in nature.
Under no circumstances is this software to be combined with any
Open Source Software in any way or placed under an Open Source License
of any type without the express written permission of mingfei.tang Holding B.V.
*/
#ifndef __SHT2X_H
#define __SHT2X_H/******************************************************************************
* C++ DECLARATION WRAPPER
******************************************************************************/
#include "n32g45x.h"#ifdef __cplusplus
extern "C" {
#endiftypedef enum sht2xOptErrorCode
{SHT2x_RES_ERR = 0X01,
}sht2xOptErrorCode;/******************************************************************************
* EXPORTED MACROS AND DEFINITIONS
******************************************************************************/ 
typedef enum sht2xResolution_t
{SHT2x_RES_12_14BIT       = 0x00, // RH=12bit, T=14bitSHT2x_RES_8_12BIT        = 0x01, // RH= 8bit, T=12bitSHT2x_RES_10_13BIT       = 0x80, // RH=10bit, T=13bitSHT2x_RES_11_11BIT       = 0x81, // RH=11bit, T=11bitSHT2x_RES_MASK           = 0x81  // Mask for res. bits (7,0) in user reg.
} sht2xResolution_t;typedef enum sht2xStatusCode {SHT2x_STATUS_OK                = 0x00,SHT2x_STATUS_VALID_DATA        = 0x01,SHT2x_STATUS_NO_CHANGE         = 0x02,SHT2x_STATUS_ABORTED           = 0x03,SHT2x_STATUS_BUSY              = 0x04,SHT2x_STATUS_SUSPEND           = 0x05,SHT2x_STATUS_ERR_IO            = 0x06,SHT2x_STATUS_ERR_BAD_DATA      = 0x07,SHT2x_STATUS_ERR_TIMEOUT       = 0x08
}sht2xStatusCode;// sensor command
typedef enum{TRIG_T_MEASUREMENT_HM    = 0xE3, // command trig. temp meas. hold masterTRIG_RH_MEASUREMENT_HM   = 0xE5, // command trig. humidity meas. hold masterTRIG_T_MEASUREMENT_POLL  = 0xF3, // command trig. temp meas. no hold masterTRIG_RH_MEASUREMENT_POLL = 0xF5, // command trig. humidity meas. no hold masterUSER_REG_W               = 0xE6, // command writing user registerUSER_REG_R               = 0xE7, // command reading user registerSOFT_RESET               = 0xFE  // command soft reset
}sht2xCommand_t;typedef enum {SHT2x_EOB_ON             = 0x40, // end of batterySHT2x_EOB_MASK           = 0x40, // Mask for EOB bit(6) in user reg.
} sht2xEob_t;typedef enum {SHT2x_HEATER_ON          = 0x04, // heater onSHT2x_HEATER_OFF         = 0x00, // heater offSHT2x_HEATER_MASK        = 0x04, // Mask for Heater bit(2) in user reg.
} etSHT2xHeater;// measurement signal selection
typedef enum{HUMIDITY,TEMP
}etSHT2xMeasureType;typedef enum{I2C_ADR_W                = 128,   // sensor I2C address + write bitI2C_ADR_R                = 129    // sensor I2C address + read bit
}etI2cHeader;typedef struct {uint8_t _step;uint8_t ret;uint8_t finish;     //1: finished, 0: idleuint8_t dataValid;  //1: valid, 0: invalidint32_t _tryCnt;int32_t _binValue;   // primordial value from sht20 register int32_t outValue;    // true temperature or humidity
} shtdrv;typedef struct {shtdrv st_Temp;shtdrv st_RH;int32_t errorCode;
}shtOpt;/******************************************************************************
* EXPORTED FUNCTIONS
******************************************************************************/
void sht2xdrv_Init( void );
void sht2xdrv_readValue( shtOpt *pshtOpt );
shtOpt *sht2xdrv_getResult( void );void SHT2X_test( void );
/******************************************************************************
* END OF C++ DECLARATION WRAPPER
******************************************************************************/#ifdef __cplusplus
}
#endif#endif /* __SHT2X_H */

4 测试

4.1 测试代码实现

代码第138行: 读取sht2x的数据

代码第141~146行:判断温度数据是否有效,格式化和打印数据

代码第149~154行:判断湿度数据是否有效,格式化和打印数据

4.2 运行程序

1) 使用NS-LINK调试代码

2) 串口log输出数据

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/35262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vision Transformers-VIT】: 计算机视觉中的Transformer探索

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Docker中修改TiDB数据库密码(类似mysql)

1.Docker容器运行TiDB pingcap/tidb:last 2.登陆容器系统&#xff1a; 3.在容器中安装mysql客户端&#xff1a; 4.空密码登陆TiDB 5.修改TiDB密码并退出 6.使用修改后的密码登陆验证&#xff1a;

Unity【GUI】基础知识

什么是UI系统 Ul是UserInterface(用户界面)的简称系统的主要学习内容 1.UI控件的使用 2.U控件的事件响应 3.U的分辨率自适应文章目录 基础知识1、工作原理和主要作用2、基本控件1、文本和按钮控件2、多选框和单选框3、输入框和拖动条4、图片绘制和框 3、复合控件1、工具栏和…

DC/AC电源模块:为新能源汽车充电系统提供高效能源转换

BOSHIDA DC/AC电源模块&#xff1a;为新能源汽车充电系统提供高效能源转换 DC/AC电源模块是新能源汽车充电系统中至关重要的组件&#xff0c;它能够将直流电转换为交流电&#xff0c;为电动车提供高效能源转换。随着人们对可持续能源的需求日益增长&#xff0c;新能源汽车成为…

java基于ssm+jsp 足球赛会管理系统

1前台首页功能模块 足球赛会管理系统&#xff0c;在系统首页可以查看首页、球队介绍、球星介绍、线下足球赛、论坛信息、个人中心、后台管理、在线客服等内容&#xff0c;如图1所示。 图1前台首页功能界面图 用户登录、用户注册&#xff0c;在注册页面可以填写账号、密码、姓名…

【sqlmap命令学习及测试dvwa_SQL_Injection】

文章目录 1.sqlmap命令及 不同级别探索 能否注入命令option1.1 low等级1.2 Medium等级1. 3 High等级 2. 注入流程2.1 数据库2.2 指定数据库表名2.3 指定表的 字段名2.4 内容2.5 当前用户信息2.6 用户密码2.7 其他 1.sqlmap命令及 不同级别探索 能否注入 命令option sqlmap -u…

昇思25天学习打卡营第2天|MindSpore快速入门-张量

张量 Tensor 张量&#xff08;Tensor&#xff09;是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数&#xff0c;这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。 张量是一种特殊的数据结构&#xff0c;与数组和矩阵非常相似。张量&#x…

《C语言》编译和链接

文章目录 一、翻译环境1、预处理2、编译3、汇编4、链接 二、运行环境 一、翻译环境 在使用编译器编写代码时&#xff0c;编写的代码是高级语言&#xff0c;机器无法直接识别和运行&#xff0c;在编译器内部会翻译成机器可执行的机器语言。 编译环境由编译和链接两大过程组成。 …

【编译原理】绪论

1.计算机程序语言以及编译 编译是对高级语言的翻译 源程序是句子的集合&#xff0c;树可以较好的反应句子的结构 编译程序是一种翻译程序 2.编号器在语言处理系统中的位置 可重定位&#xff1a;在内存中存放的起始位置不是固定的 加载器&#xff1a;修改可重定位地址&#x…

基于weixin小程序的民宿短租系统的设计与实现

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;房主管理&#xff0c;房间类型管理&#xff0c;用户管理&#xff0c;民宿信息管理&#xff0c;民宿预订管理&#xff0c;系统管理 小程序功能包括&#xff1a;系统首页&#xff0c;民宿信息&#xff0c…

博客solo!bolo-solo让博客创作更自由。

bolo-solo&#xff1a;独行侠的数字笔录&#xff0c; 你的博客新伙伴- 精选真开源&#xff0c;释放新价值。 概览 bolo-solo是GitHub 上一个开源的个人博客系统&#xff1a;Bolo Solo&#xff0c;简单易部署&#xff0c;自带精致主题、数据统计表、邮件提醒、自定义图床、功能…

Jboss多个远程命令执行漏洞(CVE-2017-12149、CVE-2015-7501、CVE-2017-7504)

目录 Jboss介绍 CVE-2017-12149 漏洞产生的原因 环境搭建 漏洞检测和利用 反弹shell CVE-2015-7501 漏洞产生的原因 环境搭建 漏洞检测和利用 反弹shell CVE-2017-7504 漏洞产生的原因 环境搭建 漏洞检测和利用 反弹shell 这一篇是参考大佬的好文章进行Jboos的…

【AIGC】如何从0开始快速打造个人知识库

如何从0开始快速打造个人知识库 文章目录 如何从0开始快速打造个人知识库前言1、注册登录2、创建知识库2.1 创建2.2 文件上传 3、使用知识库 前言 最近我在使用一些AIGC的产品时发现一个问题&#xff0c;我没有办法让它能够结合我现有的数据内容回答我的问题&#xff0c;并且让…

django学习入门系列之第三点《案例 小米商城二级菜单》

文章目录 样例划分区域搭建骨架logo区域完整代码 小结往期回顾 样例 划分区域 搭建骨架 <!-- 二级菜单部分 --> <div class"sub-header"><div class"container"><div class"logo">1</div><div class"sea…

JFrame和JScrollPanel布局初步使用

还不是很了解&#xff0c;做了几个程序&#xff1b; import java.awt.Container; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.border.EmptyBorder;public class pa1 {public static void main(String[] agrs){JF…

24/06/25(4.1122)数据存储,自定义类型

重点:1.数据类型详细介绍 2.整型在内存中的存储:原码 反码 补码 3.大小端字节序介绍和判断 4.浮点型在内存中的存储解析 前面都有char short int...详细介绍,翻一翻.需要注意的是,C语言没有字符串类型哦. 计算机永远存储的都是补码,计算也是用补码进行的,只有在要输出的时候转…

github无法访问,下载慢的解决方法

GitHub是一个存储分享无数的开源项目和代码的宝库网站。然而&#xff0c;由于一些原因&#xff0c;国内用户在访问GitHub时常常遭遇无法访问或下载速度缓慢的问题。这不仅影响了开发者的工作效率&#xff0c;也使一些想要访问下载github文件的普通用户遇到困难。下面小编就来和…

python学习笔记四

1.自己平方本身 x2 x**4#xx**4 print(x) 2.把一个多位数拆分成单个数&#xff0c;方法一通过字符串下标获取对应元素&#xff0c;并对获取的元素使用eval函数把左右引号去掉&#xff0c;是字符串变为整型&#xff1b;方法二&#xff0c;通过对数进行取余和整除得到各个位的数 …

市面上很轻的 100kW 负载组

FX100S-C 负载组 EAK的 FX100S-C 负载组在轻质外壳中以 415Vac 50Hz 提供 100kW 的连续负载。数字仪表允许您测量功率、电压、电流和频率&#xff0c;同时还允许您在进行测试时记录数据。 EAK是市场上最轻的 100kW 负载组之一&#xff0c;它将使您能够访问其他负载组无法到达…

ISCC2024--pwn

ISCC2024 练武题 chaos 考点&#xff1a;基础UAF 分析 1.首先将附件放入IDA查看主函数功能&#xff0c;进入菜单函数&#xff1a; 注意到选项5不太一样&#xff0c;跟进该功能模块的函数查看&#xff1a; 分析得到该功能存在UAF漏洞&#xff0c;system(/bin/sh) 执行的前…