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

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

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();//初始化OLEDTime_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至0Serial_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);//选择组2NVIC_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){//初始化II = 0;
}uint8_t Serial_GetI(void){//返回Ireturn 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();//初始化OLEDTime_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");elseOLED_ShowString(4, 1, "ERROr");}Function_ArrayReset(updateTime, updateDate);				}Serial_RESETI();//I至0Serial_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.rhkb.cn/news/163372.html

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

相关文章

Linux进阶-ipc共享内存

目录 共享内存 shmget()&#xff1a;创建或获取共享内存 shmat()&#xff1a;映射 shmdt()&#xff1a;解除映射 shmctl()&#xff1a;获取或设置属性 sem.h文件 sem.c文件 shm.c文件 Makefile文件 执行过程 共享内存 共享内存&#xff1a;将内存进行共享&#xff0c…

利用向导创建MFC

目录 1、项目的创建&#xff1a; 2、项目的管理 &#xff1a; 3、分析以及生成的项目代码 &#xff1a; &#xff08;1&#xff09;、查看CFrame中的消息映射宏 &#xff08;2&#xff09;、自动生成事件 &#xff08;3&#xff09;、在CFrame中添加对应的鼠标处理函数 …

计算机网络学习笔记(三):数据链路层(待更新)

目录 3.1 基本概念 3.1.1 数据链路和帧 3.1.2 三个基本问题 3.2 类型1&#xff1a;使用点对点信道的数据链路层&#xff08;路由器&#xff09; 3.2.1 点对点协议 PPP&#xff1a;特点 3.2.2 点对点协议 PPP&#xff1a;帧格式 3.2.3 点对点协议 PPP&#xff1a;工作状态 …

华为---PPP协议简介及示例配置

PPP协议简介 PPP是Point-to-Point Protocol的简称&#xff0c;中文翻译为点到点协议。与以太网协议一样,PPP也是一个数据链路层协议。以太网协议定义了以太帧的格式&#xff0c;PPP协议也定义了自己的帧格式&#xff0c;这种格式的帧称为PPP帧。 利用PPP协议建立的二层网络称为…

CSS盒子模型的详细解析

03-盒子模型 作用&#xff1a;布局网页&#xff0c;摆放盒子和内容。 盒子模型-组成 内容区域 – width & height 内边距 – padding&#xff08;出现在内容与盒子边缘之间&#xff09; 边框线 – border 外边距 – margin&#xff08;出现在盒子外面&#xff09; d…

基于Spring boot轻松实现一个多数据源框架

Spring Boot 提供了 Data JPA 的包&#xff0c;允许你使用类似 ORM 的接口连接到 RDMS。它很容易使用和实现&#xff0c;只需要在 pom.xml 中添加一个条目&#xff08;如果使用的是 Maven&#xff0c;Gradle 则是在 build.gradle 文件中&#xff09;。 <dependencies>&l…

VS2022更换背景壁纸逐步图示教程

&#x1f984;个人主页:修修修也 ⚙️操作环境:Visual Studio 2022 目录 一.下载壁纸插件 二.更改自定义壁纸 三.调整壁纸布局 一.下载壁纸插件 因为更改自定义壁纸需要一个插件的辅助,所以我们要先下载一个小插件 首先,打开VS2022,点击"扩展"->"管理扩…

PAM从入门到精通(十三)

接前一篇文章&#xff1a;PAM从入门到精通&#xff08;十二&#xff09; 本文参考&#xff1a; 《The Linux-PAM Application Developers Guide》 先再来重温一下PAM系统架构&#xff1a; ​ 更加形象的形式&#xff1a; ​ 五、主要函数详解 11. pam_open_session 概述&…

C语言求 n 阶勒让德多项式的值

完整代码&#xff1a; // 用递归法求 n 阶勒让德多项式的值 // 递归公式为&#xff1a; // n0,P(n)(x)1 // n1,P(n)(x)x // n>1,P(n)(x)((2*n-1)*x - P(n-1)(x) - (n-1)*P(n-2)(x)) / n #include<stdio.h>double func(int n,int x){if (n0){return 1;}if (n1){return…

Hadoop3教程(十):MapReduce中的InputFormat

文章目录 &#xff08;87&#xff09;切片机制与MapTask并行度决定机制&#xff08;90&#xff09; 切片源码总结&#xff08;91&#xff09;FileInputFormat切片机制&#xff08;92&#xff09;TextInputFormat及其他实现类一览&#xff08;93&#xff09; CombineTextInputFo…

44岁的「老板」想变年轻

作者 | 辰纹 来源 | 洞见新研社 从村办集体企业余杭县红星五金厂起家&#xff0c;到生产贴牌油烟机&#xff0c;再到注册“老板”商标&#xff0c;改制有限公司&#xff0c;老板电器已经走过了44个春秋。 在这44年中&#xff0c;老板电器是首家登陆资本市场的高端厨电企业&am…

uniapp高德地图ios 使用uni.chooseLocation选取位置显示没有搜索到相关数据

uniapp云打包后&#xff0c;高德地图ios选取位置显示“ 对不起&#xff0c;没有搜索到相关数据” 详细问题描述 废话不多说&#xff0c;直接上图 解决方案 1.打开高德地图开发平台 2.重新创建key 3.获取云打包时的ios报名作为安全码 4.使用生成的高德key更改manifest.json里…

IDEA同步代码到Gitee

参考博客 https://gitee.com/jakhyd/risk-operation.git

springBoot 日志

springBoot 日志 整合原理日志格式默认日志格式在配置文件中修改日志格式 在业务中写日志日志级别日志分组文件输出归档和切割归档切割 自定以日志系统切换默认日志场景 log4j2的使用 最佳实战 整合原理 规范&#xff1a;项目开发中不要编写&#xff1a;System.out.printIn()&…

UML软件哪个好?10款好用的UML工具和画图软件推荐!

UML&#xff08;统一建模语言&#xff09;图在处理复杂项目时&#xff0c;如软件开发、系统设计、业务流程分析或系统架构等&#xff0c;能够发挥巨大作用。 UML作为项目的通用蓝图&#xff0c;可以告知团队成员关于需要构建什么&#xff0c;它应该如何运作&#xff0c;以及不…

数据结构和算法(13):优先级队列

概述 按照事先约定的优先级&#xff0c;可以始终高效查找并访问优先级最高数据项的数据结构&#xff0c;也统称作优先级队列 优先级队列将操作对象限定于当前的全局极值者。 根据数据对象之间相对优先级对其进行访问的方式&#xff0c;与此前的访问方式有着本质区别&#xf…

springBoot--web--静态资源规则

规则一&#xff1a; 访问&#xff1a;/webjars/** 路径就去 classpath:/META-INF/resources/webjars/下载资源 a.maven导入依赖 规则二&#xff1a; 访问&#xff1a;/** 路径就去 静态资源默认的四个位置找资源 a. classpath:/META-INF/resources/ b.classpath:/resourc…

【UE5】 ListView使用DataTable数据的蓝图方法

【UE5】 ListView使用DataTable数据的蓝图方法 ListView 是虚幻引擎中的一种用户界面控件&#xff0c;用于显示可滚动的列表。它可以用于显示大量的数据&#xff0c;并提供了各种功能和自定义选项来满足不同的需求。 DataTable是虚幻引擎中的一种数据表格结构&#xff0c;用于存…

Flink学习笔记(三):Flink四种执行图

文章目录 1、Graph 的概念2、Graph 的演变过程2.1、StreamGraph (数据流图)2.2、JobGraph (作业图)2.3、ExecutionGraph (执行图)2.4、Physical Graph (物理图) 1、Graph 的概念 Flink 中的执行图可以分成四层&#xff1a;StreamGraph -> JobGraph -> ExecutionGraph -&g…

1811_spacemacs从v.0.200.13升级到v.0.200.14的几点变化感受

全部学习汇总&#xff1a; GreyZhang/editors_skills: Summary for some common editor skills I used. (github.com) 安装了全新的spacemacs的配置&#xff0c;查看了一下版本是v.0.200.14。在此之前&#xff0c;我使用的版本是v.0.200.13。现在还没有在这个配置上完成我所有的…