热释电矢量传感器设计
1 概述
使用4个热释电传感器组成一个2X2的矩阵。通过曲线的相位差、 峰峰值等特征量来计算相关信息。本文使用STM32单片机设计、制作了热释电传感器矩阵;使用C#.NET设计了上位机软件。为以上研究做了试验平台。
2 硬件电路设计
2.1 热释电传感器介绍
热释电红外探测器的信号产生原理主要是利用热释电材料的热释电效应。热释电材料是一种压电材料,是不具有中心对称性的晶体(如钽酸锂、硫酸三甘肽等),当这类晶体发生温度变化时使得晶体内部的原子位置变化,导致了晶体某一方向产生表面极化电荷的现象,会使晶体两端产生一个微小的电压差。如图2.1 示意了热释电效应的基本原理。如果当温度保持不变的时候,该电压会因为与空气中离散的荷中和而消失掉,所以只有温度场变化时热释电传感器才会敏感变化。
图2.1热释电效应
当热释电材料表面受到经菲涅尔透镜调制过的人体红外辐射照射后,晶体表面温度便会上升𝛥𝑇,使垂直于自发极化轴方向的晶体单位表面上的电荷𝛥𝑞发生自极化,晶体的电容值表示为𝐶,两电极之间的电压便可表示为𝛥𝑉 = 𝛥𝑞/𝐶。通过检测这一变化微弱的电压信号可以获取温度场变化趋势。本文采用D203s型号传感器,其等效电路如下图所示。当移动人体穿过其感应区时,热释电传感器输出信号反应了各热释电元件接收热辐射的通量变化量之差。连续时刻,当两片热释电元件接收的热辐射量差值不同时,便会产生一个变化的电压输出信号。
D203s等效电路
当人体沿一定方向、一定距离移动时将产生电压输出信号。图中可以看出,热释电探头的两片热释电元件分别对应两个柱形视场区域并且将其感应视场划分为盲区和高敏感区。当人体穿过其中一个敏感区域时,便会对相应的热释电元件产生一个阶跃输入,从而通过后续电路产生热释电压;而当人体穿过两敏感区的中间盲区时,由于人体红外能不能辐射到热释电元件,导致不会产生对应的输出电压。因此可以根据传感器输出时域电压信号序列,寻找一些可用特征以实现人体的检测、定位与识别。其中传感器输出信号与移动速度、距离等之间的关系如下所示:
其中 f 为输出信号的频率(HZ),Vb 为目标移动速度(m/s),fb为菲涅尔透镜
焦距(mm), s 为敏感元件大小(mm), L为目标距传感器距离(m)。
2.2 工作原理示意图
2.2 采集电路设计
根据 PIR 传感器的工作原理,当人体走过或者在菲涅尔透镜明暗相间的区域运动时,会使热释电元件表面上产生微弱的电流,然后由电路转换为电压信号输出,这个电压信号的幅值非常小,大概在 1mV 左右。信号幅值太小会导致容易受到外界环境的干扰,这样采集的数据就没有分析的意义。为了减小实验误差增加数据可靠性,设计了如下图所示的信号调理电路。
图2.3信号调理电路
传感器在供电时需要10K限流电阻,输出需要47K的匹配电阻。在经过RC滤波电路后,经过两级放大电路放大,本文采用LM358运算放大器组成放大电路。一级放大和二级放大电路间采用电容耦合,这样可以去掉传感器输出的直流分量。第二级放大电路倍数可调,通过测试选取合适放大倍数。第二级放大电路参考电压设置在1.65V,主要是因为后去ADC为0~3.3V输入。通过信号调理电路可以得到0~3.3V的电压信号,方便ADC转换。
2.3单片机电路
采用DC5V供电,电路内需要供电的芯片有3.3V和5V两种。其中D203S及其信号处理部分、蜂鸣器采用5V供电,单片机、通信芯片等采用3.3V供电。为方便操作电源输如后增加自锁电源开关,开关后设计电容滤波来提高5V电压的精度、减少文波干扰。3.3V电源使用lm1117-3.3V电源芯片,该芯片可提供500ma的稳定电流,足够系统使用。如图2.4(a)为电源电路部分。设计电源指示灯一个,用于检测3.3V电源工作与否。
单片机最小系统如图2.4(b)所示,包括了晶振电路、boot电路、以及ADC电源部分。同时设计了复位电路,通过电阻、电容的充放电时间来实现单片机的复位过程。为了方便观测程序的运行与否设计了可控LED指示灯一个,通过定时器控制闪烁提示使用者系统健康状况。单片机采用SW调试方式,该方式仅需要4跟线就可完成程序的烧写、在线调试等功能。设计了4个独立按键,用于按键操作。同时设计了一个有源蜂鸣器电路,用于产生提示、告警声音。
(a)电源电路
(b)单片机电路
(c)外围电路
(d)按键与蜂鸣器
图2.4 单片机系统电路设计
2.4串行通信电路
串行通信指数据是一位一位按顺序传送的通信方式,相对于并行通信,其突出优点是只需要一对传输线,缺点是传输速度较低。串行通信的传输方向通常有三种,单工、半双工和全双工。单向顾名思义只允许数据向一个方向传输;半双工允许两个方向传输,但在同一时刻只能往一个方向传输;全双工则允许双向同时传输数据。
串行通信有两种基本通信方式,异步通信和同步通信。异步通信不需要传输时钟信号,通信双方的时钟是各自独立的,但双方必须是相同的通信速率和数据格式,即相同的通信协议。其帧格式一般为:起始位+数据位+奇偶校验位+停止位。同步通信需要时钟同步,双方的数据收发是同时进行的。同步通信中一般字符与字符之间没有间隙,相对于异步通信不需要起始位和停止位,只需要同步信号和同步开始时的同步字符。波特率也称码元速率,为单位时间内传输符号的个数或载波调制状态改变次数,单位是Bd(Baud)。比特率又称码率,表示单位时间内传输的比特数,单位是bps(bit/s)。比特率和波特率的转换关系与信号的调制方式有关,通常为:比特率=波特率*调制位数(调制位数即码元位数)。在异步串行通信中,由于采用二进制编码,码元位数为一,通常情况下比特率=波特率。
串行异步通信
RS-232是美国电子工业联盟制定的串行数据通信接口标准,原始编号全称是EIA-RS-232(简称RS232),它被广泛用于DCE(Data Communication Equipment ) 和 DTE(Data Terminal Equipment) 之间的连接。DCE可以理解为数据通信端,比如modem设备;DTE可以理解为数据终端,比如电脑。最早的台式电脑都会保留9针的232接口,用于串口通信,目前基本被USB接口取代。现在RS232接口常用于仪器仪表设备,PLC以及嵌入式领域当作调试口来使用。图2.5给出了本文设计的RS232接口电路,为了调试方便保留了TTL电平接口(P2)。
图2.5通信电路
PCB设计
3 软件设计
软件由传感器系统软件和上位机软件组成,两个软件间通过异步串行通信进行数据交互。
3.1单片机软件设计
单片机软件架构如下图所示:包括驱动层,数据层和逻辑控制层。(具体源代码参见附录 单片机程序源码)
单片机软件设计流程如下图所示。首先初始化,然后通过定时器定时循环,采集4个热释电传感器数据,然后通过串口发送给上位机。同时预留了4个按键和一个蜂鸣器用于后续工作储备。
主函数代码,其它详见附录。
// 主函数 程序从这里开始
int main(void)
{u8 i=0,k=0;u8 sum;//发送数据的校验//串口有关变量u8 number=0;u8 State1=0x7F;u8 State2=0x0F;/*通信状态有关变量*///接收标志u8 nGotTDZHT=0;u16 nBufTD=0;u8 nGotTDZHTBY=0;u16 nBufTDBY=0;//主控计算机接收标志u8 nGotMPC=0;u16 nBufMPC=0; //串口2的一些变量初始化 Inform_OUTPUT.DATA.Frame_Head1=0xAA;Inform_OUTPUT.DATA.LEN=14;Inform_OUTPUT.DATA.state1=State1;Inform_OUTPUT.DATA.state2=State2;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);delay_init(168); LED_Init();//LED初始化// 定时器初始化TIM3_Int_Init(1000-1,168-1);RS422_Init(115200);//初始化串口2用于连接工控机DMA1_Config(DMA1_Stream6,DMA_Channel_4,(u32)&USART2->DR,(u32)BUF2,SENTDATA_LEN);//串口2DMA初始化Adc_Init();delay_us(2000);delay_ms(100);Beep=0;//关闭beep while(1){//接收到工控机数据(预留)if(New_PC==1) {New_PC=0;nGotMPC=5;nBufMPC++;State2=State2|0X01;}if(TIME_on==1) //控制周期时间到,进行ADC和数据发送{TIME_on=0;//接收MIPC监控if(nGotMPC>0){nGotMPC--;State2=State2|0X01;}else{State2=State2&0XFC;}// 读取ADC获得传感器采样值getAdcValues();i=i+1;if(i==50) //控制D1亮{ i=0;LED1=!LED1;}//串口2,给工控机发送数据Inform_OUTPUT.DATA.Sonser1Value=AdcValue[0];Inform_OUTPUT.DATA.Sonser2Value=AdcValue[1];Inform_OUTPUT.DATA.Sonser3Value=AdcValue[2];Inform_OUTPUT.DATA.Sonser4Value=AdcValue[3]; number++;number=number%16;Inform_OUTPUT.DATA.number=number<<4; sum=0;for(k=1;k<SENTDATA_LEN;k++)//计算校验和{if(k==3) continue;sum += Inform_OUTPUT.ARRAY[k];}Inform_OUTPUT.DATA.checksum=sum;// 发送数据memcpy(BUF2,&Inform_OUTPUT,SENTDATA_LEN);DMA_ClearFlag(DMA1_Stream6, DMA_FLAG_TCIF6);// MYDMA_TxEnable(DMA1_Stream6,SENTDATA_LEN,USART2); } else{}}}
3.2 上位机软件设计
C#是一种高级编程语言,当今主流开发语言占有率排名前五,该语言由微软2000年推出、面世,被微软誉为.NET平台最佳编程语言。C#以.NET类库为基础,是兼顾系统开发与应用程序开发的最佳语言。继承了C/C++简明的编程语法,封装了大多数C++类库。
C#.NET可以编写四类应用程序:
(1)桌面应用程序,主要包括Winform和WPF。二者都是优秀的桌面解决方案首选。Winform的使用者居多,主要因为Winform控件较丰富,其他语言也都用相应的winform开发环境,转行C#后选择Winform入手较快。
(2)Windows Store 应用程序。主要应用于移动、触摸设备的开发。
(3)Web应用程序。通过Web浏览器可以查看的Web页面,如ASP.NET。
(4)WCF服务。一种灵活的分布式应用程序解决方案,可以通过局域网、广域网在各种操作系统间传递任何数据。
本文将使用Visual Studio 2010和C#语言开发一款基于.NET的winform应用程序。根据系统需求本文将针对应用程序在以下几个方面展开研究:
(1)用户系统
(2)可视化界面
(3)通信系统
(4)数据库系统
应用程序主题框架如下图所示:
考虑到程序的运行效率,将采用多线程方案。在windows系统中每一个应用程序都是一个独立的进程,进程之间不能共享资源。和进程类似,每一个进程中,独立运行的程序片段叫做线程,线程间可以共享本进程中的公共资源。每个线程间是并列关系,在CPU资源充足的情况下,他们是并行运行的。
多线程可以提高应用程序的响应。特别是复杂的图形界面,如果应用程序在等待某一资源,不会按时处理图形界面,这将导致图形界面出现卡顿。如果此时采用多线程技术,将等待处理交给后台线程处理,这样等待时间过长时,就不会影响图形界面的更新。
C#通过 System.Threading.Thread类实现线程的创建和管理。创建一个线程:
Thread WriteLogThread = new Thread(new ThreadStart(WritingLog));
WriteLogThread.Start();
其中线程名 WriteLogThread,线程函数 WritingLog。WriteLogThread.Start()将开启线程,线程启动后将调用WritingLog()函数。我将在此函数中写线程要执行的程序。具体使用请见CSDN Thread类。
3.2.1 曲线图界面
GDI全称Graphics Device Interface(图形设备接口),主要负责Window系统上的图形和图像输出,开发人员利用其后续版本GDI+内置函数可以方便在设备处理和动态显示图形图像。GDI+提供的主要功能包含二维几何图形的处理、图形图像显示、排版等。System. Drawing. dll程序集中就已经封装了GDI+的功能,在开始使用GDI+类时,需在项目工程中添加System. Drawing. dll的引用,通过GDI+技术程序员可以编写与图形设备进行交互的Windows或Web图形应用程序,应用程序与图形设备之间不能直接通信,而GDI+库的作用就是将程序发送的数据转换并传递给设备。
通过GDI+提供的API函数可以实现曲线图的绘制。本文使用GDI+、checkbox等控件实现了曲线图绘制。如下图所示,具有多种颜色的曲线图,曲线图上部为曲线名称(图例),向下有四行数字分别是鼠标当前值,圈取区间最大、最小以及平均值。改曲线图可以完好的显示出实时变化的传感器曲线和各项计算结果,有助于传感器数据的理解与应用。
3.2.2通信程序
软件通过SerialPort实现异步串行通讯。
由于串口不知道数据何时到达,因此有线程实时读串口和事件触发方式两种串口数据的读取方法。实质事件方式也是在一个独立线程中处理的。
串口的初始化如下:
建立串口处理事件:
serialPort1.DataReceived +=new SerialDataReceivedEventHandler(this.serialPort1_DataReceived);
开启串口:
serialPort1.PortName = toolStripComboBox1.Text;serialPort1.BaudRate = 115200;serialPort1.Open();
串口接收处理:通过接收中断处理数据,中断函数如下所示,其中数据处理也在其中。
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e){int i=0;if(portOpen)nbyte2rec = serialPort1.BytesToRead;while (nbyte2rec >= 18&&portOpen){int res = serialPort1.ReadByte();if (res == 0xAA){nRecBuf++;if (nBuf < 15) nBuf++; else nBuf = 0;//recbuffer[0] = 0xAA;serialPort1.Read(recbuffer, 1, 18);// byte[] cheak = BytesCheck.GetCRC16ByPoly(recbuffer,0x0000, 0x8005, 0x0000,false,false,true, 1, 16);//0x8005sum = recbuffer[1] + recbuffer[2];for ( i = 4; i < 18; i++){sum += recbuffer[i];}sum &= 0xFF;if (sum != recbuffer[3]){nErrBuf++;}this.nGot = 10;_nBuf = recbuffer[2] >> 4;if (frist){frist = false;RecFirstTime = DateTime.Now;nBuf = _nBuf;}else{if (nBuf != _nBuf){if (_nBuf - nBuf < 0){nLoseBuf += _nBuf - nBuf + 16;}else{nLoseBuf += _nBuf - nBuf;}nBuf = _nBuf;}}this.DataLen = recbuffer[1];nGroup = recbuffer[2] & 0x0F;if (nGroup == 0){//Sovalue[0] = BitConverter.ToUInt16(recbuffer, 4);//Sovalue[1] = BitConverter.ToUInt16(recbuffer, 6);//Sovalue[2] = BitConverter.ToUInt16(recbuffer, 8);//Sovalue[3] = BitConverter.ToUInt16(recbuffer, 10);RunTim=(DateTime.Now-StartTime).TotalSeconds;for (i = 0; i < 4; i++){Sovalue[i] =Math.Min(4095, (int)BitConverter.ToUInt16(recbuffer, 4+i*2));}RDSoValues[0] = 0.05F * Kso[0] * (Sovalue[1] - D0so[0]) + 0.95F * RDSoValues[0];RDSsum[0] = RDSoValues[0];RDSoValues[1] = 0.05F * Kso[1] * (Sovalue[0] - D0so[1]) + 0.95F * RDSoValues[1];RDSsum[1] = RDSoValues[1];RDSoValues[2] = 0.05F * Kso[2] * (Sovalue[2] - D0so[2]) + 0.95F * RDSoValues[2];RDSsum[2] = RDSoValues[2];RDSoValues[3] = 0.05F * Kso[3] * (Sovalue[3] - D0so[3]) + 0.95F * RDSoValues[3];RDSsum[3] = RDSoValues[3];coudis(RDSoValues);//disdrawlinesControl1.Lines[0].Add(RDSoValues[0]);drawlinesControl1.Lines[1].Add(vuVpp[0]);drawlinesControl1.Lines[2].Add(dis[0]*1000);drawlinesControl1.Lines[3].Add(RDSoValues[1]);drawlinesControl1.Lines[4].Add(vuVpp[1]);drawlinesControl1.Lines[5].Add(dis[1] * 1000);drawlinesControl1.Lines[6].Add(RDSoValues[2]);drawlinesControl1.Lines[7].Add(vuVpp[2]);drawlinesControl1.Lines[8].Add(dis[2] * 1000);drawlinesControl1.Lines[9].Add(RDSoValues[3]);drawlinesControl1.Lines[10].Add(vuVpp[3]);drawlinesControl1.Lines[11].Add(dis[3] * 1000);//_list_V1.Add(RunTim, RDSoValues[1]);//_list_V2.Add(RunTim, RDSoValues[0]);//_list_V3.Add(RunTim, RDSoValues[2]);//_list_V4.Add(RunTim, RDSoValues[3]);}}nbyte2rec = serialPort1.BytesToRead;}}
3.2.3定时器与界面刷新
上位机与下位机一样,需要定时器定时刷新、更新界面显示。
初始化定时器时间,单位毫秒;
timer1.Interval = 100;
启动定时器
timer1.Start();
定时中断函数,函数内为界面刷新命令。
private void timer1_Tick(object sender, EventArgs e){//数据显示刷新label_S1.Text = dis[0].ToString("F2")+" m";label_S2.Text = dis[1].ToString("F2") + " m";label_S3.Text = dis[2].ToString("F2") + " m";label_S4.Text = dis[3].ToString("F2") + " m";drawlinesControl1._Refresh();//绘图控件刷新}
附录I
电路设计原理图和PCB:https://download.csdn.net/download/w267309080/88298439
单片机软件源码:https://download.csdn.net/download/w267309080/88298418
上位机软件源码:https://download.csdn.net/download/w267309080/88298400
相关文章:

热释电矢量传感器设计
1 概述 使用4个热释电传感器组成一个2X2的矩阵。通过曲线的相位差、 峰峰值等特征量来计算相关信息。本文使用STM32单片机设计、制作了热释电传感器矩阵;使用C#.NET设计了上位机软件。为以上研究做了试验平台。 2 硬件电路设计 2.1 热释电传感器介绍 热释电红外…...

MySql学习笔记10——视图介绍
视图 概述 view view可以看作是一张“虚拟表”,(但是他也是会作为文件存在的) 当我们通过复杂的查询语句获取一张表的时候,可以将这张表作为一个视图,和创建一个新表不同,在视图上进行的DML操作会对数据…...

【探索Linux】—— 强大的命令行工具 P.7(进程 · 进程的概念)
阅读导航 前言一、冯诺依曼体系结构二、操作系统(OS)1. 概念 三、进程1. 进程的概念2. PCB(Process Control Block)3. 查看进程 四、fork函数1. 函数简介2. 调用方式3. 返回值4. 使用示例 五、进程的几种状态1. 状态简介2. 进程状…...

JAVA宝典----容器(理解记忆)
目录 一、Java Collections框架是什么? 二、什么是迭代器? 三、Iterator与ListIterator有什么区别? 四、ArrayList、Vector和LinkedList有什么区别? 五、HashMap、Hashtable、TreeMap和WeakHashMap有哪些区别? 六…...

JS中的扩展操作符...(点点点)
标题 前言概述拓展操作符(Spread Operator)赋值与扩展操作符的区别 剩余操作符(Rest Operator) 前言 大家应该都在代码中用过或者看到…方法,我每次用到这个方法的时候都会想到第一次见到这个方法一头雾水的样子&#…...

找redis大key工具rdb_bigkeys
github官网 https://github.com/weiyanwei412/rdb_bigkeys 在centos下安装go [roothadoop102 rdb_bigkeys-master]# wget https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz [roothadoop102 rdb_bigkeys-master]# tar -zxf go1.13.5.linux-amd64.tar.gz -C /usr/local将g…...

ElasticSearch进阶
一、 search检索文档 ES支持两种基本方式检索; 通过REST request uri 发送搜索参数 (uri 检索参数);通过REST request body 来发送它们(uri请求体); 1、信息检索 API: https://w…...

Nor flash 页写地址与数据大小的限制
厂商提供的flash手册如下 如果页写指令的地址不是256的整数倍,并且写入的数据量超过了当前地址所在页的边界,则超过的那些数据会重新写入当前页的首地址(即256的整数倍地址),所以,在进行页写的时候&#x…...

python 深度学习 解决遇到的报错问题4
目录 一、DLL load failed while importing _imaging: 找不到指定的模块 二、Cartopy安装失败 三、simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 四、raise IndexError("single positional indexer is out-of-bounds") 五、T…...

C到C++的升级
C和C的关系 C继承了所有C语言的特性;C在C的基础上提供了更多的语法和特性,C语言去除了一些C语言的不好的特性。C的设计目标是运行效率与开发效率的统一。 变化一:所有变量都可以在使用时定义 C中更强调语言的实用性,所有的变量…...

《热题101》动态规划篇
思路:需要一个二维数组dp来记录当前的公共子序列长度,如果当前的两个值等,则dp[i][j]dp[i-1][j-1]1,否则dp[i][j] max(dp[i-1][j],dp[i][j-1])。也就是说,当前的dp值是由左、上、左上的值决定的。获得dp数组之后,倒序…...

【综述+3D】基于NeRF的三维视觉2023年度进展报告(截止2023.06.10)
论文:2003.Representing Scenes as Neural Radiance Fields for View Synthesis 官方网站:https://www.matthewtancik.com/nerf 突破性后续改进: Instant Neural Graphics Primitives with a Multiresolution Hash Encoding | 展示官网&#…...

基于JavaScript粒子流动效果
这是一个HTML文件,主要包含了一些CSS样式和JavaScript代码,用于创建一个动画效果。 在CSS部分,定义了一些基本的样式,包括页面的背景颜色、位置、大小等。特别的,定义了两种球形元素(.ball_A 和 .ball_B&am…...

【U盘】实现U盘清空并重置恢复存储
打开电脑,将U盘插入USB端口,点按快捷键【WinR】,弹出运行对话框,输入命令 diskpart 进入命令提示符窗口 输入指令 list disk 查看现在的硬盘 这里显示的U盘编号是“1”,因此输入select disk “1”,就是选择…...

基于Hugo 搭建个人博客网站
目录 1.环境搭建 2.生成博客 3.设置主题 4.将博客部署到github上 1.环境搭建 1)安装Homebrew brew是一个在 macOS 操作系统上用于管理软件包的包管理器。类似于centos下的yum或者ubuntu下的apt,它允许用户通过命令行安装、更新和管理各种软件工具、…...

Springboot + Sqlite实战(离线部署成功)
最近有个需求,是手机软件离线使用, 用的springboot mybatis-plus mysql,无法实现,于是考虑使用内嵌式轻量级的数据库SQLlite 引入依赖 <dependency><groupId>org.xerial</groupId><artifactId>sqlite-…...

【后量子密码】CRYSTALS-KYBER 算法(一):MLWE 问题与NTT(附源码分析)
一、前言 大多数基于数论的密码学,如Diffie-Hellman协议和RSA加密系统,依赖于大整数因子分解或特定群的离散对数等困难问题。然而,Shor 在1997年给出了对所有这些问题的高效量子算法,这将使得基于数论的密码系统在未来量子计算机时代变得不安全。相比之下,目前对于格密码…...

VTK——angleWidget的3D转换
文章目录 3D空间坐标转换例程心得 3D空间坐标转换 在冠状图、矢状面、横截面等创建的角度组件的三个端点坐标,不能直接用在3D视图中。这是因为2D切片的坐标是基于像素的,而3D空间的坐标可能是基于实际物理尺寸的。 解决方案是使用2D点的坐标、切片的物理…...

HDFS 集群动态节点管理
目录 一、动态扩容、节点上线 1.1 背景 1.2 扩容步骤 1.2.1 新机器基础环境准备 1.2.2 Hadoop 配置 1.2.3 手动启动 DataNode 进程 1.2.4 Web 页面查看情况 1.2.5 DataNode 负载均衡服务 二、动态缩容、节点下线 2.1 背景 2.2 缩容步骤 2.2.1 添加退役节点 …...

postman9.12.汉化版(附有下载链接)
想用英文版本的可以直接点击下载最新版本 这里直接付上9.12.2版本的下载链接,如果大家要下载别的版本,可以直接修改链接里面的版本号即可 ,下面是汉化包下载 链接:https://pan.baidu.com/s/1izK3HfqlfXJdq6KIYeJ2zw?pwdpetk 提…...

mysql与msql2数据驱动
mysql基本使用 数据库操作(DDL) -- 数据考操作 -- 1.查询所有数据库 SHOW DATABASES;-- 2.选择数据库 USE learn_mysql;-- 3.当前正在使用的数据库 SELECT DATABASE();-- 4.创建数据库 CREATE DATABASE IF NOT EXISTS learn_mysql;-- 5.删除数据库 DRO…...

解决微信小程序回调地狱问题
一、背景 小程序开发经常遇到根据网络请求结果,然后继续 处理下一步业务操作,代码如下: //1第一个请求 wx.request({url:"https://example.com/api/",data:data,success:function(res){//2第二个请求 wx.request({url:"http…...

cron介绍
cron表达式在线生成 在使用定时调度任务的时候,我们最常用的,就是cron表达式了。通过cron表达式来指定任务在某个时间点或者周期性的执行。 cron表达式的组成 cron表达式是一个字符串,由6到7个字段组成,用空格分隔。其中前6个字…...

mkp勒索病毒的介绍和防范,勒索病毒解密,数据恢复
mkp勒索病毒是一种新兴的电脑病毒,它会对感染的电脑进行加密,并要求用户支付一定的赎金才能解锁。这种病毒已经引起了全球范围内的关注,因为它不仅具有高危害性,而且还有很强的传播能力。本文将对mkp勒索病毒进行详细介绍…...

【面试精品】关于面试会遇到的Apache相关的面试题
1. Apache HTTP Server 基于什么协议提供网页浏览服务? 答:基于标准的http网络协议提供网页浏览服务。 2. 简述编译安装httpd软件包的基本过程? 答:解包,配置,编译,安装。 3. 编译安装httpd软…...

python对文件转md5,用于文件重复过滤
直接上代码 import hashlibdef calculate_md5(file_path):# 创建 MD5 哈希对象md5_hash hashlib.md5()# 打开文件并逐块读取,更新哈希值with open(file_path, rb) as file:while True:data file.read(8192) # 逐块读取文件,每块大小为 8192 字节if n…...

mac苹果电脑删除顽固残留软件图标
核心:删除“启动台”数据库里对应app的信息 1、打开访达(Finder),点击最顶部菜单栏的【前往》前往文件夹】,接着输入【/private/var/folders】 2、在弹出的访达(Finder)窗口搜索栏输入【com.ap…...

【jsvue】联合gtp仿写一个简单的vue框架,以此深度学习JavaScript
用 gtp 学习 Vue 生命周期的原理 lifecycle.js function Vue(options) {// 将选项保存到实例的 $options 属性中this.$options options;// 若存在 beforeCreate 钩子函数,则调用之if (typeof options.beforeCreate function) {options.beforeCreate.call(this);…...

linux centos7 系统之编程:求水仙花数
在Python编程中,有列表、元组和字典三类变量可以使用,方便数据的存储与处理,而bash中仅有字符串变量、数组、函数可用,方法运用上受到限制,这与bash基于C语言,注重语法结构的严谨有关。而Python等高级语言更…...

git中的cherry-pick和merge有些区别以及cherry-pick怎么用
git中的cherry-pick和merge在使用场景上有些区别: cherry-pick用于将另一个分支的某一次或几次commit应用到当前分支。它可以选择性地拉取代码修改。merge用于将两个分支合并成一个新分支。它会把整个分支上的所有修改都合并过来。 具体区别:cherry-pick通常用于将bug修复从发…...