Stm32_标准库_16_串口蓝牙模块_手机与蓝牙模块通信_手机传入信息能对芯片时间日期进行更改

news2024/11/19 2:41:34

实现了手机发送信息给蓝牙模块,程序对数据进行分析拆解,并更新自身数据

main.c:

#include "stm32f10x.h"    // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
#include "Time.h"
#include "Function.h"
#include <stdio.h>
#include <stdlib.h>


char *News = NULL;//存数据
unsigned int time[] = {22, 59, 30};
unsigned int date[] = {2023, 12, 31};
char month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
unsigned int updateTime[] = {0, 0, 0};
unsigned int updateDate[] = {0, 0, 0};

void TIM2_IRQHandler(void){//定时器2
	   //主要运用时间更新
	   if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){
			  
			 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除标志位
			 Time_Control(time, month, date);
		 }
		  
}
 

 
int main(void){
	 
	OLED_Init();//初始化OLED
  Time_Init();//开启计时器
	Serial_Init();//开启串口
	while(1){
		uint16_t flag = 0;
		if(Serial_GetRxFlag() == 1){
			 Delay_ms(1000);//等待数据传输完
			 News = Serial_returnNews();
			 
			 OLED_ShowString(3, 1, News);
			 if((flag = Function_DateCheck(Serial_GetRFlagTime(), Serial_GetFlagDate())) == 0){//至少得有标志符号
				  OLED_ShowString(4, 1, "error");
			 }
			 else{
				    if(flag == 1){
							if(Function_TimeUpdate(updateTime, time, News) == 1) OLED_ShowString(4, 1, ":RIGHT");//写入
				      else  OLED_ShowString(4, 1, "ERROR"); 									
						}
            else{
							  OLED_ShowString(4, 1, "/RIGHT");
						}
            Function_ArrayReset(updateTime, updateDate);				
			 }
			 flag = 0;
			 Serial_RESETI();//I至0
			 Serial_GetRxFlag();//制零否者if循环将会被执行两次
			 free(News);//释放空间必须释放否者发生地址紊乱,直接卡机
		}
		Time_Show(time);
		//Time_Show_Date(date);
		    
	}
	
}



Function.c:

#include "stm32f10x.h"
#include "Serial.h"
#include "OLED.h"
#include "Delay.h"
//一些函数的实现

void Function_ArrayClear(char *News){//恢复数组初始化
	   uint16_t i = 0;
	   for(i = 0; i < 100; i ++) News[i] = '\0';
}

uint8_t Function_ArrayLength(char * a){//计算数组长度函数
	      uint8_t length = 0;
	      uint8_t i = 0;
	      while(a[i] != '\0'){
					i ++;
					length ++;
				}
				return length;
}


uint8_t Function_DateCheck(uint8_t flagTime, uint8_t flagDate){
	   if(flagDate == flagTime) return 0;
	   if(flagTime == 1) return 1;
	   return 2;
}
uint8_t Function_Numlength(uint16_t num){
	  uint8_t length = 0;
	  if(num == 0) return (uint8_t) 1;
	  while(num > 0){
		   num = num / 10;
		   length = length + 1;
	  }
	  return length;
}
uint8_t Function_TimeDateState(unsigned int *updateTime, char *News){
	      uint8_t cnt = 0;
	      uint8_t i = 0;
	      uint8_t end = Serial_GetI();
	      while(i < end){
					if(News[i] == ':') {
						 cnt ++;
						 i ++;
						 if(cnt >= 3) return 0;
						 continue;
					}
					 
				  updateTime[cnt] = updateTime[cnt] * 10 + (News[i] - '0');
					i ++;
				}
				//OLED_ShowNum(2,1,updateTime[2], 3);
				if(cnt != 2) return 0;
				//OLED_ShowString(2, 10, "here");
			  //OLED_ShowNum(2,1,, 3);
				if(Function_Numlength(updateTime[0]) >= 3 || updateTime[0] > 23) return 0;
				//OLED_ShowString(2, 10, "here");
				if(Function_Numlength(updateTime[1]) >= 3 || updateTime[1] > 59) return 0;
				if(Function_Numlength(updateTime[2]) >= 3 || updateTime[2] > 59) return 0;
				//OLED_ShowString(2, 10, "here");
				return 1;
}

uint8_t Function_TimeUpdate(unsigned int *updateTime, unsigned int *time, char *News){
	   if(Function_TimeDateState(updateTime, News) == 1){
			  uint8_t i = 0;
			  OLED_ShowString(2, 12, "here");
			  while(i < 3){
					   time[i] = updateTime[i];
					   i ++;
				}
				return 1;
		 }
		 return 0;
}

void Function_ArrayReset(unsigned int *updateTime, unsigned int *updateDate){
	   uint8_t i = 0;
	   while(i < 3){
			 updateDate[i] = 0;
			 updateTime[i] = 0;
			 i ++;
		 }
}

Function.h:

#ifndef __FUNCTION_H
#define __FUNCTION_H
#include "stm32f10x.h"  
#include <stdio.h>

void Function_ArrayClear(char *News);
uint8_t Function_ArrayLength(char * a);
uint8_t Function_DateCheck(uint8_t flagDate, uint8_t flagTime);
uint8_t Function_Numlength(uint16_t num);
uint8_t Function_TimeDateState(unsigned int *updateTime, char *News);
uint8_t Function_TimeUpdate(unsigned int *updateTime, unsigned int *time, char *News);
void Function_ArrayReset(unsigned int *updateTime, unsigned int *updateDate);

#endif

Time.c:

#include "stm32f10x.h"
#include "OLED.h"

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/*初始化通用定时器TIM2*/
void Time_Init(void){
	   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//APB1外设开启
	   
	   TIM_InternalClockConfig(TIM2);//选择内部时钟
	
	   /*初始化时基单元*/
	   TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	   TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	   TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//ARR自动重装
	   TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//psc预分频器
	   TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//高级计时器内容直接给零
	   //记录1s 
	   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//刚初始化完就会进中断
	   
	   TIM_ClearFlag(TIM2, TIM_FLAG_Update);//消除中断标志位
	   //使能更新中断
	   TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	   /*配置中断*/
	   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择组2
	   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//定时器2在NVIC内的通道
	   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
		 NVIC_Init(&NVIC_InitStructure);
		 
		 TIM_Cmd(TIM2, ENABLE);//启动定时器
}

void Time_Control(unsigned int *time, char *month, unsigned int *date){//更新时间
	       time[2] = time[2] + 1;
        if(time[2] >= 60){
          time[2] = 0;
          time[1] = time[1] + 1;
          if(time[1] >= 60){
            time[1] = 0;
            time[0] = time[0] + 1;
            if(time[0] >= 24){
              time[0] = 0;
              date[2] = date[2] + 1;
   	          if(date[2] >= month[date[1]] + 1){
   		        date[2] = 1;
   		        date[1] = date[1] + 1;
   		        if(date[1] >= 13){
   		        	date[1] = 1;
   		        	date[0] = date[0] + 1;
   		        	if(date[0] >= 9999){
   		        		date[0] = 2023;
					   }
				   }
	           }
            }
         }
       }
				 
				
}

void Time_month2_Control(char *month,unsigned int *date){//判别闰平年 
	if((date[0] % 4 == 0 && date[0] % 100 != 0 )|| date[0] % 400 == 0) month[2] = 29;
	else month[2] = 28;
}

void Time_Show(unsigned int *time){
	   OLED_ShowNum(1,1,time[0], 2);
	   OLED_ShowString(1, 3, ":");
	   OLED_ShowNum(1,4,time[1], 2);
	   OLED_ShowString(1, 6, ":");
	   OLED_ShowNum(1,7,time[2], 2);
}
void Time_Show_Date(unsigned int *date){
	   OLED_ShowNum(2,1,date[0], 4);
	   OLED_ShowString(2, 5, "/");
	   OLED_ShowNum(2,6,date[1], 2);
	   OLED_ShowString(2, 8, "/");
	   OLED_ShowNum(2,9,date[2], 2);
}


Time.h:

//显示时间&日期
#ifndef __TIME_H
#define __TIME_H
#include "stm32f10x.h"  
#include <stdio.h>

void Time_Init(void);
void Time_Control(unsigned int *time, char *month, unsigned int *date);
void Time_month2_Control(char *month,unsigned int *date);
void Time_Show(unsigned int *time);
void Time_Show_Date(unsigned int *date);
	
#endif

Serial.c:

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>
#include "Delay.h"
#include <stdlib.h>
#include "OLED.h"

uint8_t Serial_RxData;//存数据
uint8_t Serial_RxFlag;//标志位
GPIO_InitTypeDef GPIO_InitStructu;//GPIO
USART_InitTypeDef USART_InitStructure;//串口
NVIC_InitTypeDef NVIC_InitStructur;//中断
char news[100] = "";//存数据
uint8_t I = 0;
uint8_t flagDate = 0;//标志是否传入日期数据
uint8_t flagTime = 0;//标志是否传入时间数据


void Serial_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	 
	GPIO_InitStructu.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructu.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructu.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructu);
	
	GPIO_InitStructu.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructu.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructu.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructu);
	
	
	 
	USART_InitStructure.USART_BaudRate = 9600;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART1, &USART_InitStructure);
	
	
	
	 
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//通道
	
	 
	NVIC_InitStructur.NVIC_IRQChannel = USART1_IRQn;//中断通道
	NVIC_InitStructur.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructur.NVIC_IRQChannelPreemptionPriority = 3;
	NVIC_InitStructur.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructur);
	
	USART_Cmd(USART1, ENABLE);
}


uint8_t Serial_GetRxFlag(void)//读取标志位后自动青除
{
	if (Serial_RxFlag == 1)
	{
		Serial_RxFlag = 0;
		return 1;
	}
	return 0;
}

uint8_t Serial_GetFlagDate(void)//读取标志位后自动青除
{
	if (flagDate == 1)
	{
		flagDate = 0;
		return 1;
	}
	return 0;
}

uint8_t Serial_GetRFlagTime(void)//读取标志位后自动青除
{
	if (flagTime == 1)
	{
		flagTime = 0;
		return 1;
	}
	return 0;
}

void Serial_GetRxFlag_SET(void){
	   Serial_RxFlag = 1;
}

char * Serial_returnNews(void){//返还一个数组
	     char * array;
	     //int j = I;
	     uint8_t i = 0;
	     array = (char *) malloc(sizeof(char) * 100);
	     while(i < I){
				    if(news[i] == '/') flagDate = 1;
				    if(news[i] == ':') flagTime = 1;
				    array[i] = news[i];
				    i ++;
			 }
			 return array;
}

void Serial_RESETI(void){//初始化I
	   I = 0;
}

uint8_t Serial_GetI(void){//返回I
	   return I;
}
	
void USART1_IRQHandler(void)//中断函数
{
	
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		news[I] = USART_ReceiveData(USART1);//读数据
		Serial_RxFlag = 1;//至标志位为有数据
		I ++;
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
		 
	}
}


Serial.h:

#ifndef __SERIAL_H
#define __SERIAL_H
#include "stm32f10x.h"  
#include <stdio.h>

void Serial_Init(void);
uint8_t Serial_GetRxFlag(void);
uint8_t Serial_GetRxData(void);
void Serial_GetRxFlag_SET(void);
char * Serial_returnNews(void);
void Serial_RESETI(void);
uint8_t Serial_GetI(void);
uint8_t Serial_GetRFlagTime(void);
uint8_t Serial_GetFlagDate(void);

#endif

效果:

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
时间 + 日期

main.c:

#include "stm32f10x.h"    // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
#include "Time.h"
#include "Function.h"
#include <stdio.h>
#include <stdlib.h>


char *News = NULL;//存数据
unsigned int time[] = {22, 59, 30};
unsigned int date[] = {2023, 12, 31};
char month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
unsigned int updateTime[] = {0, 0, 0};
unsigned int updateDate[] = {0, 0, 0};

void TIM2_IRQHandler(void){//定时器2
	   //主要运用时间更新
	   if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){
			  
			 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除标志位
			 Time_Control(time, month, date);
		 }
		  
}
 

 
int main(void){
	 
	OLED_Init();//初始化OLED
  Time_Init();//开启计时器
	Serial_Init();//开启串口
	while(1){
		uint16_t flag = 0;
		Time_month2_Control(month, date); 
		if(Serial_GetRxFlag() == 1){
			 Delay_ms(1000);//等待数据传输完
			 News = Serial_returnNews();
			 
			 OLED_ShowString(3, 1, News);
			 if((flag = Function_DateCheck(Serial_GetRFlagTime(), Serial_GetFlagDate())) == 0){//至少得有标志符号
				  OLED_ShowString(4, 1, "error");
			 }
			 else{
				    if(flag == 1){
							if(Function_TimeUpdate(updateTime, time, News) == 1) OLED_ShowString(4, 1, ":RIGHT");//写入
				      else  OLED_ShowString(4, 1, "ERROR"); 									
						}
            else{
							  if(Function_DateUpdate(updateDate,date,News) == 1)OLED_ShowString(4, 1, "/RIGHT");
							  else
									  OLED_ShowString(4, 1, "ERROr");
						}
            Function_ArrayReset(updateTime, updateDate);				
			 }
			 Serial_RESETI();//I至0
			 Serial_GetRxFlag();//制零否者if循环将会被执行两次
			 free(News);//释放空间必须释放否者发生地址紊乱,直接卡机
		}
		Time_Show(time);
		Time_Show_Date(date);
		    
	}
	
}


Function.c:

#include "stm32f10x.h"
#include "Serial.h"
#include "OLED.h"
#include "Delay.h"
//一些函数的实现

void Function_ArrayClear(char *News){//恢复数组初始化
	   uint16_t i = 0;
	   for(i = 0; i < 100; i ++) News[i] = '\0';
}

uint8_t Function_ArrayLength(char * a){//计算数组长度函数
	      uint8_t length = 0;
	      uint8_t i = 0;
	      while(a[i] != '\0'){
					i ++;
					length ++;
				}
				return length;
}


uint8_t Function_DateCheck(uint8_t flagTime, uint8_t flagDate){
	   if(flagDate == flagTime) return 0;
	   if(flagTime == 1) return 1;
	   return 2;
}
uint8_t Function_Numlength(uint16_t num){
	  uint8_t length = 0;
	  if(num == 0) return (uint8_t) 1;
	  while(num > 0){
		   num = num / 10;
		   length = length + 1;
	  }
	  return length;
}
uint8_t Function_TimeDateState(unsigned int *updateTime, char *News){
	      uint8_t cnt = 0;
	      uint8_t i = 0;
	      uint8_t end = Serial_GetI();
	      while(i < end){
					if(News[i] == ':') {
						 cnt ++;
						 i ++;
						 if(cnt >= 3) return 0;
						 continue;
					}
					 
				  updateTime[cnt] = updateTime[cnt] * 10 + (News[i] - '0');
					i ++;
				}
				 
				if(cnt != 2) return 0;
				 
				if(Function_Numlength(updateTime[0]) >= 3 || updateTime[0] > 23) return 0;
				 
				if(Function_Numlength(updateTime[1]) >= 3 || updateTime[1] > 59) return 0;
				if(Function_Numlength(updateTime[2]) >= 3 || updateTime[2] > 59) return 0;
				 
				return 1;
}

uint8_t Function_TimeUpdate(unsigned int *updateTime, unsigned int *time, char *News){
	   if(Function_TimeDateState(updateTime, News) == 1){
			  uint8_t i = 0;
			  //OLED_ShowString(2, 12, "here");
			  while(i < 3){
					   time[i] = updateTime[i];
					   i ++;
				}
				return 1;
		 }
		 return 0;
}

void Function_ArrayReset(unsigned int *updateTime, unsigned int *updateDate){
	   uint8_t i = 0;
	   while(i < 3){
			 updateDate[i] = 0;
			 updateTime[i] = 0;
			 i ++;
		 }
}

uint8_t Function_DateState(unsigned int *updateDate, char *News){
	      uint8_t cnt = 0;
	      uint8_t i = 0;
	      uint8_t end = Serial_GetI();
	      char month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	      while(i < end){
					if(News[i] == '/') {
						 cnt ++;
						 i ++;
						 if(cnt >= 3) {
							 
							 return 0;
						 }
						 continue;
					}
					updateDate[cnt] = updateDate[cnt]* 10 + (News[i] - '0');
					i ++;
        }
				 
				if(cnt != 2) return 0;
				  
				if(Function_Numlength(updateDate[0]) >= 5 || updateDate[0] > 9999 || updateDate[0] == 0) return 0;
				
				if((updateDate[0] % 4 == 0 && updateDate[0] % 100 != 0 )|| updateDate[0] % 400 == 0) month[2] = 29;
	      else month[2] = 28;
				 
				if(Function_Numlength(updateDate[1]) >= 3 || updateDate[1] > 12 || updateDate[1] == 0) return 0;
				if(Function_Numlength(updateDate[2]) >= 3 || updateDate[2] > month[updateDate[1]]|| updateDate[2] == 0) return 0;
				 
				return 1;
				
}

uint8_t Function_DateUpdate(unsigned int *updateDate, unsigned int *date, char *News){
	   if(Function_DateState(updateDate, News) == 1){
			  uint8_t i = 0;
			   
			  while(i < 3){
					   date[i] = updateDate[i];
					   i ++;
				}
				return 1;
		 }
		 return 0;
}


Function.h:

#ifndef __FUNCTION_H
#define __FUNCTION_H
#include "stm32f10x.h"  
#include <stdio.h>

void Function_ArrayClear(char *News);
uint8_t Function_ArrayLength(char * a);
uint8_t Function_DateCheck(uint8_t flagDate, uint8_t flagTime);
uint8_t Function_Numlength(uint16_t num);
uint8_t Function_TimeDateState(unsigned int *updateTime, char *News);
uint8_t Function_TimeUpdate(unsigned int *updateTime, unsigned int *time, char *News);
void Function_ArrayReset(unsigned int *updateTime, unsigned int *updateDate);
uint8_t Function_DateState(unsigned int *updateDate, char *News);
uint8_t Function_DateUpdate(unsigned int *updateDate, unsigned int *date, char *News);

#endif

效果:

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

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

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

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

相关文章

无人驾驶路径规划(一)全局路径规划 - RRT算法原理及实现

前言&#xff1a;由于后续可能要做一些无人驾驶相关的项目和实验&#xff0c;所以这段时间学习一些路径规划算法并自己编写了matlab程序进行仿真。开启这个系列是对自己学习内容的一个总结&#xff0c;也希望能够和优秀的前辈们多学习经验。 一、无人驾驶路径规划 众所周知&a…

Google Authenticator 和gitlab使用的方法配置Google AuthenticatorGoogle

Google Authenticator 和gitlab使用的方法 目录概述需求&#xff1a; 设计思路实现思路分析1.配置过程&#xff1a; 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a bette…

D201126 D201129 支持以太网高级物理层(APL)

D201126 D201129 支持以太网高级物理层(APL) 全球技术和软件领导者艾默生宣布了基于其无限自动化愿景&#xff0c;并作为其下一代以软件为中心的工业自动化架构的基础。新技术的发布将超越传统的控制系统&#xff0c;创建一个更先进的自动化平台&#xff0c;为人类和塑造世界…

【网络】网络层协议:IP(待更新)

文章目录 IP 协议1. 基本概念2. IP 报头解析 &#x1f53a;IP 的 网段划分&#xff1a; IP 协议 IP 不是面向字节流的&#xff0c;而是发送接收一个个的数据包 1. 基本概念 主机&#xff1a;配有 IP 地址的设备 路由器&#xff1a;配有单个或多个 IP 地址&#xff0c;且能进行…

【1314. 矩阵区域和】

目录 一、题目描述二、算法思想三、代码实现 一、题目描述 二、算法思想 三、代码实现 class Solution { public:vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {//先预处理数组int nmat.size();//行int mmat[0].size();…

flutter开发实战-下拉刷新与上拉加载更多实现

flutter开发实战-下拉刷新与上拉加载更多实现 在开发中经常遇到列表需要下拉刷新与上拉加载更多&#xff0c;这里使用EasyRefresh&#xff0c;版本是3.3.21 一、什么是EasyRefresh EasyRefresh可以在Flutter应用程序上轻松实现下拉刷新和上拉加载。它几乎支持所有Flutter Sc…

C++指针和引用

1、引用必须初始化&#xff0c;指针不必&#xff0c;所以说引用使你更安全的指针&#xff1b; 2、在汇编代码&#xff0c;指针和引用一模一样&#xff1b; 3、引用只有一级引用&#xff0c;没有多级引用&#xff1b; 4、引用必须引用一个能取地址的变量&#xff1b; 左值&…

第三章 内存管理 五、动态分区分配算法(首次适应算法、最佳适应算法、最坏适应算法、临近适应算法)

目录 一、首次适应算法 1、算法思想&#xff1a; 2、如何实现&#xff1a; 3、两种常用的数据结构: &#xff08;1&#xff09;空闲分区表、空闲分区链 4、例子 二、最佳适应算法 1、算法思想: 2、如何实现: 3、例子&#xff1a; 三、最坏适应算法 1、算法思想&…

蓝桥杯每日一题2023.10.16

数的分解 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 最开始想使用dfs&#xff0c;发现范围过大无法在规定时间运行 #include<bits/stdc.h> using namespace std; const int N 2e5 10; int a[N], v[N], ans; void dfs(int dep, int sum, int start) {if(sum > 20…

Linux命令行下查看实时网速

Linux命令行下&#xff0c;用ifconfig可以看到每个网卡实时的收发的数据包了字节数&#xff0c;但并不方便查看当前网卡的实时网速。 近日偶得一个软件叫nload可以方便的在命令行下查看实时网速&#xff0c;不敢独享&#xff0c;分享给大家。 1、安装 sudo apt install nload…

第三章 内存管理 六、基本分页存储管理

目录 一、定义 二、例子 三、总结 一、定义 基本分页存储管理是一种操作系统的存储管理技术。在基本分页存储管理中&#xff0c;物理内存被划分成固定大小的块&#xff0c;称为页面&#xff08;Page&#xff09;&#xff0c;而程序代码和数据被分成相同大小的块&#xff0c;…

数据结构:二叉树(1)

目录 树的概念 树的表示形式 二叉树 二叉树的性质 题目 二叉树的存储 链式存储 初始化二叉树 二叉树的遍历 前序遍历&#xff1a;根&#x1f449;左子树&#x1f449;右子树 中序遍历&#xff1a;左子树&#x1f449;根&#x1f449;右子树 后序遍历&#xff1a;左子…

二十八、【滤镜】

文章目录 滤镜库Camera Raw滤镜神经网络滤镜(Neurel Filters)液化其他滤镜 滤镜库 可以在滤镜库中选择一些常用的滤镜方式&#xff0c;主要有六大类&#xff1a; Camera Raw滤镜 Camera Raw滤镜是photoshop最重要的一个滤镜&#xff0c;他帮助我们在摄影后期去进行颜色预处…

导数、偏导数、方向导数

一、导数 导数是描述函数变化率的数学概念。 导数的定义式: 那么就有一个问题&#xff0c;为什么求函数的最大值点是要对其自变量求导&#xff0c;并使其导数等于0 比如:求L(θ)3lnθ2ln(1-θ)的最大值点 既然导数表示函数的变化率&#xff0c;那么当函数L(θ)的导数等于0&…

Go语言基础之包

包&#xff08;package&#xff09; Go语言中支持模块化的开发理念&#xff0c;在Go语言中使用包&#xff08;package&#xff09;来支持代码模块化和代码复用。一个包是由一个或多个Go源码文件&#xff08;.go结尾的文件&#xff09;组成&#xff0c;是一种高级的代码复用方案…

构建高性能物联网数据平台:EMQX和CnosDB的完整教程

CnosDB 是一款高性能、高压缩率、高易用性的开源分布式时序数据库。主要应用场景为物联网、工业互联网、车联网和IT运维。所有代码均已在GitHub开源。本文将介绍如何使用EMQX 这一MQTT 服务器 CnosDB 构建物联网数据平台&#xff0c;实现物联网数据的实时流处理。 前言 在物联…

CLIP和改进工作

CLIP和改进工作 CLIP 改进方向 语义分割 Lseg、GroupViT 目标检测 ViLD、GLIP v1/v2 视频理解 VideoCLIP、CLIP4clip、ActionCLIP 图像生成 VQGAN-CLIP、CLIPasso、CLIP-Draw 多模态下游任务 VL Downstream 其他 prompt enginering&#xff08;CoOp等&#xff09; depthCLIP、…

(C++ STL) 详解vector模拟实现

目录 一.vector的介绍 1.vector的介绍 二.vector的定义模拟实现 三.vector各接口的模拟实现 1.vector迭代器的模拟实现 2.构造函数 2.1无参构造 2.2 n个val构造 2.3迭代器区间构造 2.4通过对象初始化&#xff08;拷贝构造&#xff09; 3.析构函数 4.size 5.operato…

PCB沉金包边工艺流程与主要作用经验总结

🏡《总目录》 目录 1,什么是PCB沉积包边2,PCB沉金包边作用2.1,射频屏蔽2.2,EMC认证2.3,防氧化2.4,强电屏蔽2.5,美观3,PCB沉金包边的工艺流程4,总结1,什么是PCB沉积包边 PCB沉金包边是指,在PCB的侧边也包裹上铜皮,并在铜皮的表面进行沉金工艺。在高频电路板中经常…

探索数字时代的核心:服务器如何塑造未来并助你成就大业

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…