HP6心率血压传感器
目录
一、介绍
1、工作原理概述
2、具体实现步骤
二、HP6的通信及配置
1、通信接口
2、器件地址/命令
3、校验
三、程序设计
①IIC通信相关基础函数
②HP6相关基础函数
一、介绍
HP6心率血压传感器的原理主要基于光电容积脉搏波描记法(PPG),这是一种利用光测量脉搏的技术。
1、工作原理概述
HP6传感器通过绿色发光二极管(LED)发光来探测脉搏跳动的强弱变化。当LED发出的绿光照射到皮肤时,由于血管组织在脉搏跳动过程中对于光线的吸收率不同,透过皮肤组织反射回的光被光敏传感器接受并转换成电信号。这些电信号再经过数字化处理,根据血液的吸光率即可算出心率和血压值。
2、具体实现步骤
发光与探测:HP6传感器内部至少包含两个绿色LED和一个光电传感器。LED发光照射到皮肤表面,光电传感器则负责接收反射回的光信号。
信号转换:反射回的光信号被光敏传感器接收后,转换成电信号。这些电信号代表了脉搏跳动的强弱变化。
数据处理:转换后的电信号经过放大、滤波等处理,以消除噪声和干扰。然后,通过HP6传感器内部的算法对这些信号进行分析,计算出精确的心率和血压值。
数值反馈与定位:最后,通过GSM和GPS模块实现对心率血压的数值反馈和当前位置信息的定位
二、HP6的通信及配置
HP-6 适用于 IIC 接口通讯,7bite 硬件地址:0x66;IIC 通讯速率 为 100K。
1、通信接口
IIC通信方式
供电范围: >=3.3v
接口:IIC_SDA IIC_SCL VCC GND EN
硬件连接:
HP6_IIC_SCL--------PA2
HP6_IIC_SDA--------PA1
HP6_EN-------------PC13 低电平有效
获取到的数据不需要二次计算,直接就是需要的数据
2、器件地址/命令
器件地址:
手册描述是7位器件地址是 0x66 110 0110
通过位运算计算器件地址
器件地址写: 0x66<<1 110 01100
器件地址读: (0x66<<1) | 0x01 110 01101
器件命令:
说明:
对此传感器的操作是要发送24个字节的命令组,实际就是要发一个数组,发完每个命令组后,主控芯片会收到24个字节.
开启心率命令组 获取心率命令组 关闭心率命令组
开启血压命令组 获取血压命令组 关闭血压命令组
所以:
对每个操作过程定义一个24元素数组,数组的内容就是22字节命令和2个字节的校验值
要通过IIC函数封装一个发送24字节函数 和 接收24字节函数
3、校验
校验的目的:
每个命令组都是24个字节,所以,传感器为了数据准确性的检查,所以要校验数据的正确性
校验过程:
校验方式用的是CRC16校验
发送24个字节命令需要校验
要发送24个字节数据
校验数据计算是从4号字节到21号字节(18个), 用户通过校验函数自己计算校验值
把校验值给到要发送的命令数组的22 和23 号字节
把带有校验值的命令数组发送给传感器(连续发送24个字节函数)
传感器接收命令组并且自动计算校验值, 然后跟用户的的校验值比较
接收24个字节数据需要校验
传感器将要发送的数据及传感器自己计算的校验值发送给主控芯片
用户接收24个字节数据到数组中(连续接收24字节函数)
用户需要将数组中的4到21号字节传入到校验函数计算校验值
用户计算的校验值与传感器回传的校验值对比看是否数据正确
所以:
封装主控芯片与HP6发收24字节并且校验的函数
三、程序设计
所用到的宏定义:
//宏定义器件地址
#define Hp6_ADDR_W (0x66<<1)
#define Hp6_ADDR_R (0x66<<1 | 0x01)//供电引脚宏定义
#define Hp_6_PowerON (GPIOC->ODR &= ~(1 << 13))
#define Hp_6_PowerOFF (GPIOC->ODR |= (1 << 13))//时钟线宏定义
#define HP6_IIC_SCL_L (GPIOA->ODR &= ~(1<<2))
#define HP6_IIC_SCL_H (GPIOA->ODR |= (1<<2))
//数据线宏定义
//输出
#define HP6_IIC_SDA_OUT_L (GPIOA->ODR &= ~(1<<1))
#define HP6_IIC_SDA_OUT_H (GPIOA->ODR |= (1<<1))
//输入
#define HP6_IIC_SDA_IN (GPIOA->IDR & (1<<1))
①IIC通信相关基础函数
/***********************************************
*函数名 :ph6_iic_io_init
*函数功能 :IIC所用IO口初始化
*函数参数 :无
*函数返回值:无
*函数描述 :HP6_HP6_IIC_SCL------PA2HP6_IIC_SDA------PA1
************************************************/
void hp6_iic_io_init(void)
{//端口时钟使能RCC->AHB1ENR |= (1<<0);//端口模式配置GPIOA->MODER &= ~((3<<2)|(3<<4));GPIOA->MODER |= ((1<<2)|(1<<4));//输出类型配置GPIOA->OTYPER &= ~(1<<2); //SCL---推挽GPIOA->OTYPER |= (1<<1); //SDA---开漏 //输出速度配置GPIOA->OSPEEDR &= ~((3<<2)|(3<<4));//上下拉配置GPIOA->PUPDR &= ~((3<<2)|(3<<4));//空闲状态GPIOA->ODR |= (1<<2); GPIOA->ODR |= (1<<1);
}/***********************************************
*函数名 :hp6_iic_star
*函数功能 :IIC起始信号函数
*函数参数 :无
*函数返回值:无
*函数描述 :
************************************************/
void hp6_iic_star(void)
{//时钟线拉低 为了可以动数据线HP6_IIC_SCL_L;//数据线拉高 为了可以产生下降沿HP6_IIC_SDA_OUT_H;//时钟线拉高 为了产生起始信号HP6_IIC_SCL_H;TIM11_delay_us(10);//数据线拉低 产生下降沿从而产生起始信号HP6_IIC_SDA_OUT_L;TIM11_delay_us(10);//时钟线拉低 安全作用HP6_IIC_SCL_L;
}/***********************************************
*函数名 :hp6_iic_stop
*函数功能 :IIC停止信号函数
*函数参数 :无
*函数返回值:无
*函数描述 :
************************************************/
void hp6_iic_stop(void)
{HP6_IIC_SCL_L; //为了可以动数据线HP6_IIC_SDA_OUT_L; //为了可以产生上升沿HP6_IIC_SCL_H; //为了产生停止信号TIM11_delay_us(10);HP6_IIC_SDA_OUT_H; //产生了上升沿,从而停止信号TIM11_delay_us(10);}/***********************************************
*函数名 :hp6_iic_send_ack
*函数功能 :IIC发送应答/不应答信号
*函数参数 :u8 ack
*函数返回值:无
*函数描述 :ack : 0 应答ack : 1 不应答
************************************************/
void hp6_iic_send_ack(u8 ack)
{HP6_IIC_SCL_L; //为了可以动数据线TIM11_delay_us(10);if(ack==0){HP6_IIC_SDA_OUT_L; //为了保持低电平 应答}else{HP6_IIC_SDA_OUT_H; //为了保持高电平 不应答}TIM11_delay_us(10);HP6_IIC_SCL_H; //产生应答信号TIM11_delay_us(10);//安全作用HP6_IIC_SCL_L;}/***********************************************
*函数名 :hp6_iic_get_ack
*函数功能 :IIC检测应答/不应答信号
*函数参数 :无
*函数返回值:u8
*函数描述 :返回0 检测到的是应答信号返回1 检测到的是不应答信号
************************************************/
u8 hp6_iic_get_ack(void)
{u8 ack;/*将数据线切换为输入模式*/HP6_IIC_SCL_L;HP6_IIC_SDA_OUT_H; /*获取应答/不应答信号*/HP6_IIC_SCL_L; //帮助从机拉低时钟线,从机就可以改变数据线了TIM11_delay_us(10);HP6_IIC_SCL_H; //从机产生了应答/不应答信号, 主机可以读数据线TIM11_delay_us(10);if(HP6_IIC_SDA_IN){ack = 1; //不应答}else{ack = 0; //应答}//安全作用HP6_IIC_SCL_L;return ack;}/***********************************************
*函数名 :hp6_iic_send_byte
*函数功能 :IIC发送一个字节函数
*函数参数 :u8 data
*函数返回值:无
*函数描述 :
************************************************/
void hp6_iic_send_byte(u8 data)
{u8 i;for(i=0;i<8;i++){HP6_IIC_SCL_L; //可以写数据TIM11_delay_us(10);if(data & 0x80){HP6_IIC_SDA_OUT_H; //表示数据对应位是1}else{HP6_IIC_SDA_OUT_L; //表示数据对应位是0}TIM11_delay_us(10);HP6_IIC_SCL_H; //从机可以读数据TIM11_delay_us(10);//发送次高位data = data << 1;}//安全作用HP6_IIC_SCL_L; }/***********************************************
*函数名 :hp6_iic_rec_byte
*函数功能 :IIC接收一个字节函数
*函数参数 :无
*函数返回值:u8
*函数描述 :
************************************************/
u8 hp6_iic_rec_byte(void)
{u8 i;u8 data;/*将数据线切换输入模式*/HP6_IIC_SCL_L; HP6_IIC_SDA_OUT_H; /*接收一个字节数据*/for(i=0;i<8;i++){HP6_IIC_SCL_L; //帮助从机拉低时钟线,可以写数据TIM11_delay_us(10);HP6_IIC_SCL_H; //主机可以读数据TIM11_delay_us(10);data = data << 1;if(HP6_IIC_SDA_IN){data = data | 0x01;}}//安全HP6_IIC_SCL_L;return data;}
②HP6相关基础函数
HP6所用到的命令:
//开启血压测量
u8 cmd_bp_open[]=
{0xc8,0xd7,0xb6,0xa5,0x90,0x01,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//关闭血压测量
u8 cmd_bp_close[]=
{0xc8,0xd7,0xb6,0xa5,0x90,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//获取血压测量结果
u8 cmd_bp_result[]=
{0xc8,0xd7,0xb6,0xa5,0x90,0x02,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//开启心率测量
u8 cmd_rate_open[]=
{0xc8,0xd7,0xb6,0xa5,0xD0,0x01,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//关闭心率测量
u8 cmd_rate_close[]=
{0xc8,0xd7,0xb6,0xa5,0xD0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//获取心率测量结果
u8 cmd_rate_result[]=
{0xc8,0xd7,0xb6,0xa5,0xD0,0x02,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//获取ADC 数据
u8 cmd_get_adc[]=
{0xc8,0xd7,0xb6,0xa5,0x91,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//设置低功耗
u8 cmd_set_powersaving[]=
{0xc8,0xd7,0xb6,0xa5,0x70,0x01,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//获取版本信息
u8 cmd_get_version[]=
{0xc8,0xd7,0xb6,0xa5,0xa2,0x02,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
crc校验表:
const u16 crc16_tab[256] =
{0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
};
PH6的初始化函数
/************************************************
*函数名 :Hp6_init
*函数功能 :HP6初始化函数
*函数参数 :无
*函数返回值:无
*函数描述 : HP6_EN管脚HP6_IIC_IO;
***************************************************/
void Hp_6_init(void)
{/*HP6_IIC_IO*/hp6_iic_io_init();/*HP6_EN管脚*/RCC->AHB1ENR |= 1 << 2;GPIOC->MODER &= ~(3 << 26);GPIOC->MODER |= 1 << 26;GPIOC->OTYPER &= ~(1 << 13);GPIOC->OSPEEDR &= ~(3 << 26);/*HP6电源使能*/Hp_6_PowerON;//延时50tim11_delay_ms(50);
}
利用IIC连续发送24字节函数
/************************************************
*函数名 :Hp_6_I2CWrite
*函数功能 :主机通过IIC协议发送24字节数据到Hp6
*函数参数 :u8 *pData
*函数返回值:无
*函数描述 :主机发送命令数组给Hp6
***************************************************/
void Hp_6_I2CWrite(u8 *pData)
{u8 i;u8 ack;hp6_iic_star();hp6_iic_send_byte(Hp6_ADDR_W); hp6_iic_get_ack();//发送24字节数据for(i=0;i<24;i++){hp6_iic_send_byte(*(pData+i)); hp6_iic_get_ack();}hp6_iic_stop();
}
利用IIC连续接收24字节函数
/************************************************
*函数名 :Hp_6_I2CRead
*函数功能 :主机通过IIC协议从hp6读24字节数据
*函数参数 :u8 *rData 接收到的数据存放地址
*函数返回值:无
*函数描述 :HP6回传的数据
***************************************************/
void Hp_6_I2CRead(u8 *rData)
{u8 i;hp6_iic_star();hp6_iic_send_byte(Hp6_ADDR_R); hp6_iic_get_ack();//读24字节数据for(i=0;i<24;i++){*(rData+i) = hp6_iic_rec_byte(); if(i == 23){hp6_iic_send_ack(1); //不再接收数据}else{hp6_iic_send_ack(0); //继续接收下一个字节数据}}hp6_iic_stop();
}
CRC16校验函数
/************************************************
*函数名 :Crc16
*函数功能 :CRC16校验函数
*函数参数 :u8 *data,u8 len
*函数返回值:无
*函数描述 :u8 *data :校验的数据的起始位置u8 len :数据的个数
***************************************************/
u16 Crc16(u8 *data,u8 len)
{u16 crc16 = 0xFFFF;u32 uIndex ; //CRC查询表索引while (len --){uIndex = (crc16&0xff) ^ ((*data) & 0xff) ; //计算CRCdata = data + 1;crc16 = ((crc16>>8) & 0xff) ^ crc16_tab[uIndex];}return crc16 ;//返回CRC校验值
}
主控芯片与HP6发\收24字节并且校验的函数
/************************************************
*函数名 :HP_6_SendCmd_CRC
*函数功能 :发送命令数组到HP6,HP6返回数组,并且校验
*函数参数 :u8 *tx_buff,u8 *rx_buff
*函数返回值:u8
*函数描述 :返回值位1表示校验正确返回值位0表示校验错误
***************************************************/
u8 HP_6_SendCmd_CRC(u8 *tx_buff,u8 *rx_buff)
{u16 crc;u16 crc_r;u8 sta = 1;/*发送命令组*///计算要发送的数据的校验值crc = Crc16(&tx_buff[4],18);//将计算后的校验值赋值到命令数组中22 23*(u16 *)&tx_buff[22] = crc;//将24个字节数据发送给HP6Hp_6_I2CWrite(tx_buff);/*接收命令组*///接收到24个字节数据Hp_6_I2CRead(rx_buff);//计算接收回来的数组校验值crc = Crc16(&rx_buff[4],18); //校验值 主机自己计算的校验//提出接收回来的校验值crc_r = *(u16 *)&rx_buff[22]; //校验值 从机计算的校验//对比计算校验值与传感器校验值if(crc != crc_r){sta=0;}return sta;
}
开启心率函数
/************************************************
*函数名 :HP_6_OpenRate
*函数功能 :开启心率测量函数
*函数参数 :无
*函数返回值:u8
*函数描述 :此函数的返回值如果是1,就证明发送的命令已经执行,开启成功如果是0 传感器5s开启失败
***************************************************/
u8 HP_6_OpenRate(void)
{u8 sta;u8 rx_buff[24]= {0};timer_buff[5] = 0; //开始计时do{//5s开启失败就跳出if(timer_buff[5] >= 5000){return 0;}sta = HP_6_SendCmd_CRC(cmd_rate_open,rx_buff);}while(!sta || !rx_buff[6]);return 1;
}
关闭心率函数
/************************************************
*函数名 :HP_6_CloseRate
*函数功能 :关闭心率测量函数
*函数参数 :无
*函数返回值:u8
*函数描述 :此函数的返回值如果是1,就证明发送的命令已经执行,关闭成功如果是0 关闭失败 传感器5s超时处理
***************************************************/
u8 HP_6_CloseRate(void)
{u8 sta ;u8 rx_buff[24];timer_buff[5] = 0; //开始计时do{//5s关闭失败就跳出if(timer_buff[5] >= 5000){return 0;}//发送心率测量命令sta = HP_6_SendCmd_CRC(cmd_rate_close,rx_buff);}while(!sta || !rx_buff[6]);return 1;
}
获取心率函数
/*********************************************
*函数名 :HP_6_GetRateResult
*函数功能 :获取心率测量结果函数
*函数参数 :u8 *result //存放心率结果地址
*函数返回值:无
*函数描述 :
**********************************************/
void HP_6_GetRateResult(u8 *result)
{u8 rx_buff[24] = {0};u8 sta;//发送心率测量命令sta = HP_6_SendCmd_CRC(cmd_rate_result,rx_buff);if(sta == 1){*result = rx_buff[7];}
}
开启血压函数
/************************************************
*函数名 :HP_6_Openbp
*函数功能 :开启血压测量函数
*函数参数 :无
*函数返回值:u8
*函数描述 :此函数的返回值如果是1,就证明发送的命令已经执行,开启成功如果是0 传感器5s开启失败
***************************************************/
u8 HP_6_Openbp(void)
{u8 sta;u8 rx_buff[24]= {0};timer_buff[5] = 0; //开始计时do{//5s开启失败就跳出if(timer_buff[5] >= 5000){return 0;}sta = HP_6_SendCmd_CRC(cmd_bp_open,rx_buff);}while(!sta || !rx_buff[6]);return 1;
}
关闭血压函数
/************************************************
*函数名 :HP_6_Closebp
*函数功能 :关闭血压测量函数
*函数参数 :无
*函数返回值:u8
*函数描述 :此函数的返回值如果是1,就证明发送的命令已经执行,关闭成功如果是0 关闭失败 传感器5s超时处理
***************************************************/
u8 HP_6_Closebp(void)
{u8 sta ;u8 rx_buff[24];timer_buff[5] = 0; //开始计时do{//5s关闭失败就跳出if(timer_buff[5] >= 5000){return 0;}//发送心率测量命令sta = HP_6_SendCmd_CRC(cmd_bp_close,rx_buff);}while(!sta || !rx_buff[6]);return 1;
}
获取血压函数
/*********************************************
*函数名 :HP_6_Get_bpResult
*函数功能 :获取血压测量结果函数
*函数参数 :u8 *result 接收到血压数据数组
*函数返回值:void
*函数描述 :
**********************************************/
void HP_6_Get_bpResult(u8 *result)
{u8 state;u8 r_buff[24] = {0};state = HP_6_SendCmd_CRC(cmd_bp_result,r_buff);if(state==1 && r_buff[7]==1) //测量成功{*result = r_buff[10];*(result+1) = r_buff[11];HP_6_Closebp();HP_6_Openbp();}else if(state==1 && r_buff[7]==2) //测量失败{*result = 0;*(result+1) = 0;HP_6_Closebp();HP_6_Openbp();}}
相关文章:
HP6心率血压传感器
目录 一、介绍 1、工作原理概述 2、具体实现步骤 二、HP6的通信及配置 1、通信接口 2、器件地址/命令 3、校验 三、程序设计 ①IIC通信相关基础函数 ②HP6相关基础函数 一、介绍 HP6心率血压传感器的原理主要基于光电容积脉搏波描记法(PPG)&…...
深入理解 JVM 中的 G1 垃圾收集器原理、算法、过程和参数配置
引言 Java 虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称 GC)是自动内存管理的核心部分。G1(Garbage-First)垃圾收集器是 Oracle 在 JDK 7u4 版本中引入的一种新型垃圾收集器,…...
细说敏捷:敏捷四会之standup meeting
上一篇文章中,我们讨论了 敏捷四会 中 冲刺计划会 的实施要点,本篇我们继续分享敏捷四会中实施最频繁,团队最容易实施但往往也最容易走形的第二个会议:每日站会 关于每日站会的误区 站会是一个比较有标志性的仪式活动࿰…...
MySQL系列之身份鉴别(安全)
导览 前言Q:如何保障MySQL数据库身份鉴别的有效性一、有效性检查1. 用户唯一2. 启用密码验证3. 是否存在空口令用户4. 是否启用口令复杂度校验5. 是否设置口令的有效期6. 是否限制登录失败尝试次数7. 是否设置(超过尝试次数)锁定的最小时长8.…...
vue3封装Element Plus table表格组件
支持绝大部分Element Plus原有设置属性,支持分页,支持动态适配高度 效果展示 组件代码: <template><div class"table-wrap" ref"tableWrap"><el-tableclass"w100 h100":data"tableInfo.…...
SFP+光模块介绍
SFP光模块介绍 1 SFP光模块简介(Small Form -Factor Pluggable)2 光模块管脚定义 1 SFP光模块简介(Small Form -Factor Pluggable) 光模块(Optical Module)由光电子器件、功能电路和光接口等组成,光电子器件包括激光发射器(Laser Transmitte…...
神经网络的初始化
目录 为什么需要初始化? 初始化的常用方法: 是否必须初始化? 初始化神经网络中的权重和偏置是深度学习模型训练中非常重要的一步,虽然在某些情况下不进行初始化也能训练出模型,但正确的初始化方法能够显著提高训练效…...
数据集搜集器0.01
我们使用Python的Tkinter库来创建GUI界面,并使用requests库来从360百科获取数据。下面是一个完整的示例代码,它包括了一个简单的GUI界面,用户可以输入问题,点击按钮后会从360百科获取相关信息,并显示在同一个Text组件中…...
【Lucene】搜索引擎和文档相关性评分 BM25 算法的工作原理
BM25 算法的工作原理: 什么是 BM25 算法? BM25 是一种流行的文本检索算法,广泛用于搜索引擎和文档相关性评分。它基于概率检索模型,旨在评估查询和文档之间的相关性。 核心公式 BM25 的公式如下: score ( D , Q ) …...
嵌入式Linux——文件类型
目录 普通文件 目录文件 目录文件的权限与管理 字符设备文件和块设备文件 符号链接文件 查看符号链接 删除符号链接 修改符号链接 管道文件 匿名管道(Anonymous Pipe) 匿名管道的特点: 使用示例: 命名管道(…...
ES6 模块化语法
目录 ES6 模块化语法 分别暴露 统一暴露 编辑 默认暴露 ES6 模块化引入方式 ES6 模块化语法 模块功能主要由两个命令构成:export 和 import。 ⚫ export 命令用于规定模块的对外接口(哪些数据需要暴露,就在数据前面加上关键字即可…...
Gradio学习笔记记录
安装指令:pip install gradio方法介绍 Interface》用于构建一些简单的页面,可以直接用这个指令搞定 形式》接收三个参数分别为处理函数、输入、输出三部分,呈现一般左/上为输入,右或下为输出 fn:将用户界面 ࿰…...
Node.js的下载与安装(支持各种新旧版本)
目录 1、node官网 2、node软件下载 3、软件安装(完整版) 1、node官网 Node.js — Download Node.jshttps://nodejs.org/en/download/package-manager 2、node软件下载 按照下图进行选择node版本(真心推荐16/18,而是尽量是LTS…...
数据库和缓存的数据一致性 -20241124
问题描述 一致性 缓存中有数据,缓存的数据值数据库中的值缓存中本没有数据,数据库中的值最新值(有请求查询数据库时,会将数据写入缓存,则变为上面的“一致”状态) “数据不一致”: 缓存的数据值…...
【计算机网络】多路转接之select
系统提供select()来实现多路转接 IO 等 拷贝 -> select()只负责等待,可以一次等待多个fd select()本身没有数据拷贝的能力,拷贝要read()/write()来完成 一、select的使用 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exc…...
Linux命令思维导图
看到一个很不错的Linux命令思维导图,用机器翻译了一下,建议收藏备用。 附上英文版:...
自然语言处理(词嵌入和词向量的使用)
一、实验目的 1.了解词嵌入和词向量的基本概念及其在自然语言处理中的应用。 2.掌握使用One-Hot编码和Word2Vec模型构建词向量的方法。 3.掌握Doc2Vec模型构建文档向量的方法以及如何计算文档向量之间的相似度。 二、实验内容 (1)使用One-Hot编码构…...
量子感知机
神经网络类似于人类大脑,是模拟生物神经网络进行信息处理的一种数学模型。它能解决分类、回归等问题,是机器学习的重要组成部分。量子神经网络是将量子理论与神经网络相结合而产生的一种新型计算模式。1995年美国路易斯安那州立大学KAK教授首次提出了量子…...
[HarmonyOS] 解决HMRouter路由地址无法抽取的问题
解决HMRouter路由地址无法抽取的问题 背景 最近开始学习HarmonyOS开发,搭建项目的时候采用了 HMRouter 路由框架,在项目里使用到路由跳转,官方链接在这: https://gitee.com/hadss/hmrouter/blob/master/HMRouterLibrary/README…...
七天掌握SQL--->第四天:事务处理与并发控制
# 7天掌握SQL - 第四天:事务处理与并发控制 ## 目标 - 学习事务处理的基本概念,如ACID特性。 - 掌握并发控制的方法,如锁机制、事务隔离级别等。 - 通过实际案例练习事务处理和并发控制。 ## 1. 事务处理的基本概念 事务处理是数据库管理系…...
Docker学习笔记整理
这周不知道写点啥内容做个分享,但还是秉持学会分享的精神,粗略放一些Docker相关的问题和解答吧,后面有机会再补补再深挖深挖o(>﹏<)o 1. 容器VS虚拟机 虚拟机是一种带环境安装的解决方案(资源完全隔离),有以下缺…...
PIMPL模式和D指针
一、PIMPL模式概念: Pimpl(pointer to implementation, 指向实现的指针)是一种用来对“类的接口与实现”进行解耦合的方法。就是将真正的实现细节的Implementor从类定义的头文件中分离出去,公有类通过一个私有指针指向隐藏的实现类…...
Linux入门系列--文件与目录
一、介绍 在Linux中,有着一句话,叫做:一切皆文件。也就是任何东西都是以文件的形式存储的。 目录结构 bin:全程binary,含义是二进制。该目录中存储的都是一些二进制文件。我们学过C/C,其实也都知道机器能…...
论文阅读——Intrusion detection systems using longshort‑term memory (LSTM)
一.基本信息 论文名称:Intrusion detection systems using longshort‑term memory (LSTM) 中文翻译:基于长短期记忆(LSTM)的入侵检测系统 DOI:10.1186/s40537-021-00448-4 作者:FatimaEzzahra Laghrissi1* , Samira Douzi2*, Kha…...
平面点排序(结构体专题)
(1) 题目描述 平面上有n个点,坐标均为整数。请按与坐标原点(0,0)距离的远近将所有点排序输出。可以自己写排序函数,也可以用qsort库函数排序。 输入描述 输入有两行,第一行是整数n(1<n<10)ÿ…...
QT 实现仿制 网络调试器(未实现连接唯一性) QT5.12.3环境 C++实现
网络调试助手: 提前准备:在编写代码前,要在.pro工程文件中,添加network模块。 服务端: 代码: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QtWidgets> #inclu…...
搜索引擎中广泛使用的文档排序算法——BM25(Best Matching 25)
在搜索场景中,BM25能计算每个文档与查询的匹配度,从中找出最相关的文档,并按相关性高低排序展示。 要理解BM25,需要掌握以下几个关键概念: 1. 词频(Term Frequency, TF):某关键词在文…...
文件上传需要考虑的安全性问题及解决方案
恶意文件上传:攻击者可能上传包含恶意代码的文件,如病毒、木马等,这些文件被服务器执行后,可能完全控制服务器或破坏服务器安全。为避免这种情况,应实施严格的文件验证策略,只允许特定的安全文件类型上传&a…...
论文笔记:Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks
1. 挑战/问题(Challenges/Issues): 这篇论文探讨了大型预训练语言模型在处理知识密集型自然语言处理(NLP)任务时面临的挑战。尽管这些模型在参数中存储了大量事实知识,并在微调后能够在下游NLP任务中取得很…...
Web 网络安全
一. 浏览器系统安全方面,使用多进程方案,而js主线程运行在渲染进程中,渲染进程时运行在沙箱中的,没有对本地OS文件的直接读写权限,所以需要通过IPC与浏览器主线程通信,才可以获取cookie等信息,这…...
Android Gradle 插件和 Android Studio 兼容性
Android Gradle 插件和 Android Studio 兼容性 Android Studio 版本所需的 AGP 版本Ladybug 2024.2.13.2-8.7Ladybug 2024.2.13.2-8.7Koala 2024.1.12024.2.1Jellyfish 2023.3.12024.2.1Iguana 2023.2.13.2-8.3Hedgehog 2023.1.13.2-8.2Giraffe 2022.3.13.2-8.1Flamingo 2022.…...
C++设计模式-策略模式-StrategyMethod
动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。 如何在运…...
【H2O2|全栈】JS案例章节(四)——使用原型的JS工厂模式
目录 前言 开篇语 准备工作 需求 工厂模式 概念 优点 添加元素的新方法 分析案例 HTML代码 JS实现 结束语 前言 开篇语 本系列为短章节,单独讲述部分特殊重点案例,本期讲述使用原型来实现JS的工厂模式。 与HTML和CSS相比,JS加…...
.NET9 - 新功能体验(三)
书接上回,我们继续来聊聊.NET9和C#13带来的新变化。 01、Linq新方法 CountBy 和 AggregateBy 引入了新的方法 CountBy 和 AggregateBy后,可以在不经过GroupBy 分配中间分组的情况下快速完成复杂的聚合操作,同时方法命名也非常直观࿰…...
论文概览 |《Journal of Urban Technology》2024 Vol.31 Issue.2
本次给大家整理的是《Journal of Urban Technology》杂志2024年第31卷第2期的论文的题目和摘要,一共包括6篇SCI论文! 论文1 Aerial Video Surveillance in a Megacity: A Case Study in Santiago, Chile 大城市中的空中视频监控:智利圣地亚哥…...
Makefile 之 自动化变量
作用范围只在这条规则以及连带规则中,所以其值也只在作用范围内有效。而不会影响规则链以外的全局变量的值。 "$" 表示目标的集合,就像一个数组,"$"依次取出目标,并执于命令。 "$<"和"$&qu…...
【C语言】const修饰符在指针变量中的作用详解
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯指针与解引用:基础概念1. 指针变量2. 解引用操作 💯const 修饰指针变量的三种主要情况1. 情况一:int * const p (指针本…...
阿里云ECS服务器监控报警配置
背景:服务器偶尔会异常,比如CPU过载,磁盘满,影响使用,人工盯服务器不现实 采用方法:阿里云监控告警功能 步骤: 第一步:登录阿里云服务器 https://account.aliyun.com/login/logi…...
高性能linux服务器运维实战小结 性能调优工具
性能指标 进程指标 进程关系 父进程创子进程时,调fork系统调用。调用时,父给子获取一个进程描述符,并设置新的pid,同事复制父进程的进程描述符给子进程,此时不会复制父进程地址空间,而是父子用相同地址空…...
初识Linux—— 基本指令(下)
前言: 本篇继续来学习Linux的基础指令,继续加油!!! 本篇文章对于图片即内容详解,已同步到本人gitee:Linux学习: Linux学习与知识讲解 Linux指令 1、查看文件内容的指令 cat cat 查看文件…...
【Linux】线程的互斥和同步
【Linux】线程的互斥和同步 线程间的互斥 临界资源:多线程执行共享的资源就叫做临界资源临界区:每个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时刻,互斥保证有且只有一个执行流进入临界区&#…...
详解Oracle表的类型(二)
1.引言: Oracle数据库提供了多种表类型,以满足不同的数据存储和管理需求。本博文将对Oracle分区表及使用场景进行详细介绍。 2. 分区表 分区表是Oracle数据库中一种重要的表类型,它通过将表数据分割成多个逻辑部分来提高查询性能、管理灵活…...
VSCode 下载 安装
VSCode【下载】【安装】【汉化】【配置C环境(超快)】(Windows环境)-CSDN博客 Download Visual Studio Code - Mac, Linux, Windowshttps://code.visualstudio.com/Downloadhttps://code.visualstudio.com/Download 注意࿰…...
java中的最小堆
概述 最小堆minHeap指的级别n的每个节点存储的值小于或等于级别n1的子节点的值。因此,根就存储了其中最小的值。 注意节点的值与其他兄弟节点的值之间没有必然关系。 java中最小堆的表示 利用数组 常用的是利用数组minHeap[]表示,将最小堆的节点或值…...
ES实用面试题
一、es是什么,为什么要用它? ES通常是Elasticsearch的简称,它是一个基于Lucene构建的开源搜索引擎。Elasticsearch以其分布式、高扩展性和实时数据分析能力而闻名,广泛用于全文搜索、日志分析、实时监控等多种场景。 基本特点&am…...
数据结构 (7)线性表的链式存储
前言 线性表是一种基本的数据结构,用于存储线性序列的元素。线性表的存储方式主要有两种:顺序存储和链式存储。链式存储,即链表,是一种非常灵活和高效的存储方式,特别适用于需要频繁插入和删除操作的场景。 链表的基本…...
数据结构:链表进阶
链表进阶 1. ArrayList的缺陷2. 链表2.1 链表的概念及结构2.2 链表的实现 3.链表面试题4.LinkedList的使用5.1 什么是LinkedList4.2 LinkedList的使用 5. ArrayList和LinkedList的区别 1. ArrayList的缺陷 通过源码知道,ArrayList底层使用数组来存储元素࿱…...
Can UDS 学习记录
目录 Can UDS 学习记录10 03 响应否定响应22和24 的说明27服务肯定响应抑制位 Can UDS 学习记录 10 03 响应 否定响应22和24 的说明 0x22条件不正确,就是不满足服务端的运行条件0x24请求顺序错误;停止例程的请求必须在开始例程后面才可以,请…...
C 语言实现的优先级队列
C 语言实现的优先级队列 priorityqueue.h /******************************************************************************* * Copyright © 2024-2025 Light Zhang <mapawarehotmail.com>, MapAware, Inc. * * ALL RIGHTS RESERVED. …...
卷积神经网络(CNN)中的批量归一化层(Batch Normalization Layer)
批量归一化层(BatchNorm层),或简称为批量归一化(Batch Normalization),是深度学习中常用的一种技术,旨在加速神经网络的训练并提高收敛速度。 一、基本思想 为了让数据在训练过程中保持同一分布…...