当前位置: 首页 > news >正文

STC15系列单片机通过串口多字节数据读写EEPROM操作

STC15系列单片机通过串口多字节数据读写EEPROM操作


  • 📌相关篇《STC15系列单片机EEPROM读写示例》

⛳手册勘误信息注意事项

在这里插入图片描述

  • ⚡在手册上面描述STC15F2K60S2及STC15L2K60S2系列单片机内部EEPROM还可以用MOVC指令读,但此时首地址不再是0000H,而是程序存储空间结束地址的下一个地址。
  • 🔰实际上STC15F2K60S2型号单片机验证时发现,EEPROM起始扇区首地址:0x0000 - 0x0200 2个扇区(1K=512X2),而不是像手册上描述的在CODE区后面的2个扇区。
  • ⚡对于IAP型号的单片机,EEPROM扇区在CODE(程序区)后面。
    在这里插入图片描述
  • 例如上面的程序编译信息,可以得知程序所占用的容量code=551,转换为扇区,就是需要占用2个扇区(2 X 512),对于IAP单片机,整个ROM区都可以作为eeprom使用,在不覆盖程序的情况下,从第3扇区作为eeprom的首地址:0x600

📝STC15系列单片机通过串口读写EEPROM示例

  • ✨这里以 STC15F2K60S2为烧录对象为例。采用22.1184MHz,波特率:115200
  • 程序代码
/*---------------------------------------------------------------------*/
/* --- STC MCU International Limited ----------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.GXWMCU.com --------------------------------------------*/
/* --- QQ:  800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序   */
/*---------------------------------------------------------------------*//*************	本程序功能说明	**************测试说明通过串口对STC内部自带的EEPROM(FLASH)进行读写测试。对FLASH做扇区擦除、写入、读出的操作,命令指定地址。默认波特率:  115200,8,N,1. 
默认主时钟:  22118400HZ.串口命令设置: (命令字母不区分大小写)W 0x8000 1234567890  --> 对0x8000地址写入字符1234567890.R 0x8000 10          --> 对0x8000地址读出10个字节数据. 注意:为了通用,程序不识别地址是否有效,用户自己根据具体的型号来决定。******************************************/#define 	MAIN_Fosc			22118400L	//定义主时钟
#include	"STC15Fxxxx.H"#define		Baudrate1			115200L
#define		Tmp_Length			70		//读写EEPROM缓冲长度#define		UART1_BUF_LENGTH	(Tmp_Length+9)	//串口缓冲长度u8	RX1_TimeOut;
u8	TX1_Cnt;	//发送计数
u8	RX1_Cnt;	//接收计数
bit	B_TX1_Busy;	//发送忙标志u8 	xdata 	RX1_Buffer[UART1_BUF_LENGTH];	//接收缓冲
u8	xdata	tmp[Tmp_Length];		//EEPROM操作缓冲void	UART1_config(u8 brt);	// 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
void	PrintString1(u8 *puts);
void	UART1_TxByte(u8 dat);
void	delay_ms(u8 ms);
u8		CheckData(u8 dat);
u16		GetAddress(void);
u8		GetDataLength(void);
void	EEPROM_SectorErase(u16 EE_address);
void 	EEPROM_read_n(u16 EE_address,u8 *DataAddress,u8 length);
u8		EEPROM_write_n(u16 EE_address,u8 *DataAddress,u8 length);/********************* 主函数 *************************/
void main(void)
{u8	i,j;u16 addr;u8	status;P0M1 = 0;	P0M0 = 0;	//设置为准双向口P1M1 = 0;	P1M0 = 0;	//设置为准双向口P2M1 = 0;	P2M0 = 0;	//设置为准双向口P3M1 = 0;	P3M0 = 0;	//设置为准双向口P4M1 = 0;	P4M0 = 0;	//设置为准双向口P5M1 = 0;	P5M0 = 0;	//设置为准双向口P6M1 = 0;	P6M0 = 0;	//设置为准双向口P7M1 = 0;	P7M0 = 0;	//设置为准双向口UART1_config(1);	// 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.EA = 1;	//允许总中断PrintString1("STC15F2K60S2系列单片机EEPROM测试程序, 串口命令设置如下示例:\r\n");	//SUART1发送一个字符串PrintString1("W 0x8000 1234567890  --> 对0x8000地址写入字符1234567890.\r\n");	//SUART1发送一个字符串PrintString1("R 0x8000 10          --> 对0x8000地址读出10个字节数据.\r\n");	//SUART1发送一个字符串while(1){delay_ms(1);if(RX1_TimeOut > 0)		//超时计数{if(--RX1_TimeOut == 0){//		for(i=0; i<RX1_Cnt; i++)	UART1_TxByte(RX1_Buffer[i]);	//把收到的数据原样返回,用于测试status = 0xff;	//状态给一个非0值if((RX1_Cnt >= 10) && (RX1_Buffer[1] == ' ') && (RX1_Buffer[8] == ' '))	//最短命令为10个字节{for(i=0; i<8; i++){if((RX1_Buffer[i] >= 'a') && (RX1_Buffer[i] <= 'z'))	RX1_Buffer[i] = RX1_Buffer[i] - 'a' + 'A';	//小写转大写}addr = GetAddress();if(addr < 63488)	//限制在0~123扇区{if(RX1_Buffer[0] == 'W')	//写入N个字节{j = RX1_Cnt - 9;if(j > Tmp_Length)	j = Tmp_Length;	//越界检测EEPROM_SectorErase(addr);			//擦除扇区i = EEPROM_write_n(addr,&RX1_Buffer[9],j);		//写N个字节if(i == 0){PrintString1("已写入");if(j >= 100)	{UART1_TxByte(j/100+'0');	j = j % 100;}if(j >= 10)		{UART1_TxByte(j/10+'0');	j = j % 10;}UART1_TxByte(j%10+'0');PrintString1("字节数据!\r\n");}else	PrintString1("写入错误!\r\n");status = 0;	//命令正确}else if(RX1_Buffer[0] == 'R')	//PC请求返回N字节EEPROM数据{j = GetDataLength();if(j > Tmp_Length)	j = Tmp_Length;	//越界检测if(j > 0){PrintString1("读出");UART1_TxByte(j/10+'0');UART1_TxByte(j%10+'0');PrintString1("个字节数\xfd据如下:\r\n");EEPROM_read_n(addr,tmp,j);for(i=0; i<j; i++)	UART1_TxByte(tmp[i]);UART1_TxByte(0x0d);UART1_TxByte(0x0a);status = 0;	//命令正确}}}}if(status != 0)	PrintString1("命令错误!\r\n");RX1_Cnt  = 0;	//清除字节数}}}
}
//========================================================================//========================================================================
// 函数: void  delay_ms(unsigned char ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void  delay_ms(u8 ms)
{unsigned int i;do{i = MAIN_Fosc / 14000;while(--i)	;   //14T per loop}while(--ms);
}//========================================================================
// 函数: u8	CheckData(u8 dat)
// 描述: 将字符"0~9,A~F或a~f"转成十六进制.
// 参数: dat: 要检测的字符.
// 返回: 0x00~0x0F为正确. 0xFF为错误.
// 版本: V1.0, 2012-10-22
//========================================================================
u8	CheckData(u8 dat)
{if((dat >= '0') && (dat <= '9'))		return (dat-'0');if((dat >= 'A') && (dat <= 'F'))		return (dat-'A'+10);return 0xff;
}//========================================================================
// 函数: u16	GetAddress(void)
// 描述: 计算各种输入方式的地址.
// 参数: 无.
// 返回: 16位EEPROM地址.
// 版本: V1.0, 2013-6-6
//========================================================================
u16	GetAddress(void)
{u16	address;u8	i,j;address = 0;if((RX1_Buffer[2] == '0') && (RX1_Buffer[3] == 'X')){for(i=4; i<8; i++){j = CheckData(RX1_Buffer[i]);if(j >= 0x10)	return 65535;	//erroraddress = (address << 4) + j;}return (address);}return	65535;	//error
}/**************** 获取要读出数据的字节数 ****************************/
u8	GetDataLength(void)
{u8	i;u8	length;length = 0;for(i=9; i<RX1_Cnt; i++){if(CheckData(RX1_Buffer[i]) >= 10)	break;length = length * 10 + CheckData(RX1_Buffer[i]);}return (length);
}//========================================================================
// 函数: void PrintString1(u8 *puts)
// 描述: 串口1发送字符串函数。
// 参数: puts:  字符串指针.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注: 
//========================================================================
void PrintString1(u8 *puts)	//发送一个字符串
{for (; *puts != 0;	puts++)	UART1_TxByte(*puts);  	//遇到停止符0结束
}//========================================================================
// 函数: SetTimer2Baudraye(u16 dat)
// 描述: 设置Timer2做波特率发生器。
// 参数: dat: Timer2的重装值.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注: 
//========================================================================
void	SetTimer2Baudraye(u16 dat)	// 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
{AUXR &= ~(1<<4);	//Timer stopAUXR &= ~(1<<3);	//Timer2 set As TimerAUXR |=  (1<<2);	//Timer2 set as 1T modeTH2 = dat / 256;TL2 = dat % 256;IE2  &= ~(1<<2);	//禁止中断AUXR |=  (1<<4);	//Timer run enable
}//========================================================================
// 函数: void	UART1_config(u8 brt)
// 描述: UART1初始化函数。
// 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注: 
//========================================================================
void	UART1_config(u8 brt)	// 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
{/*********** 波特率使用定时器2 *****************/if(brt == 2){AUXR |= 0x01;		//S1 BRT Use Timer2;SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate1);}/*********** 波特率使用定时器1 *****************/else{TR1 = 0;AUXR &= ~0x01;		//S1 BRT Use Timer1;AUXR |=  (1<<6);	//Timer1 set as 1T modeTMOD &= ~(1<<6);	//Timer1 set As TimerTMOD &= ~0x30;		//Timer1_16bitAutoReload;TH1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) / 256);TL1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) % 256);ET1 = 0;	//禁止中断INT_CLKO &= ~0x02;	//不输出时钟TR1  = 1;}/*************************************************/SCON = (SCON & 0x3f) | 0x40;	//UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率
//	PS  = 1;	//高优先级中断ES  = 1;	//允许中断REN = 1;	//允许接收P_SW1 &= 0x3f;P_SW1 |= 0x00;		//UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7 (必须使用内部时钟)
//	PCON2 |=  (1<<4);	//内部短路RXD与TXD, 做中继, ENABLE,DISABLEB_TX1_Busy = 0;TX1_Cnt = 0;RX1_Cnt = 0;RX1_TimeOut = 0;
}//========================================================================
// 函数: void	UART1_TxByte(u8 dat)
// 描述: 发送一个字节.
// 参数: 无.
// 返回: 无.
// 版本: V1.0, 2014-6-30
//========================================================================void	UART1_TxByte(u8 dat)
{SBUF = dat;B_TX1_Busy = 1;while(B_TX1_Busy);
}//========================================================================
// 函数: void UART1_int (void) interrupt UART1_VECTOR
// 描述: UART1中断函数。
// 参数: nine.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注: 
//========================================================================
void UART1_int (void) interrupt UART1_VECTOR
{if(RI){RI = 0;if(RX1_Cnt >= UART1_BUF_LENGTH)	RX1_Cnt = 0;RX1_Buffer[RX1_Cnt] = SBUF;RX1_Cnt++;RX1_TimeOut = 5;}if(TI){TI = 0;B_TX1_Busy = 0;}
}/*
STC15F/L2KxxS2	扇区分配,512字节/扇区,从0x0000开始。型号        大小   扇区数  开始地址  结束地址   MOVC读偏移地址
STC15F/L2K08S2   53K   106扇区  0x0000  ~  0xD3FF        0x2000
STC15F/L2K16S2   45K    90扇区  0x0000  ~  0xB3FF        0x4000
STC15F/L2K24S2   37K    74扇区  0x0000  ~  0x93FF        0x6000
STC15F/L2K32S2   29K    58扇区  0x0000  ~  0x73FF        0x8000
STC15F/L2K40S2   21K    42扇区  0x0000  ~  0x53FF        0xA000
STC15F/L2K48S2   13K    26扇区  0x0000  ~  0x33FF        0xC000
STC15F/L2K56S2   5K     10扇区  0x0000  ~  0x13FF        0xE000
STC15F/L2K60S2   1K      2扇区  0x0000  ~  0x03FF        0xF000STC15F/L2K61S2   无EPROM, 整个122扇区的FLASH都可以擦写 地址 0x0000~0xF3ff.
*/#define		ISP_ENABLE()	ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY)
#define		ISP_DISABLE()	ISP_CONTR = 0; ISP_CMD = 0; ISP_TRIG = 0; ISP_ADDRH = 0xff; ISP_ADDRL = 0xff//========================================================================
// 函数: void DisableEEPROM(void)
// 描述: 禁止EEPROM.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2014-6-30
//========================================================================
void DisableEEPROM(void)		//禁止访问EEPROM
{ISP_CONTR = 0;				//禁止ISP/IAP操作ISP_CMD   = 0;				//去除ISP/IAP命令ISP_TRIG  = 0;				//防止ISP/IAP命令误触发ISP_ADDRH = 0xff;			//指向非EEPROM区,防止误操作ISP_ADDRL = 0xff;			//指向非EEPROM区,防止误操作
}//========================================================================
// 函数: void	EEPROM_Trig(void)
// 描述: 触发EEPROM操作.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2014-6-30
//========================================================================
void	EEPROM_Trig(void)
{F0 = EA;	//保存全局中断EA = 0;		//禁止中断, 避免触发命令无效ISP_TRIG();							//先送5AH,再送A5H到ISP/IAP触发寄存器,每次都需要如此//送完A5H后,ISP/IAP命令立即被触发启动//CPU等待IAP完成后,才会继续执行程序。_nop_();_nop_();EA = F0;	//恢复全局中断
}//========================================================================
// 函数: void	EEPROM_SectorErase(u16 EE_address)
// 描述: 擦除一个扇区.
// 参数: EE_address:  要擦除的EEPROM的扇区中的一个字节地址.
// 返回: none.
// 版本: V1.0, 2014-6-30
//========================================================================
void	EEPROM_SectorErase(u16 EE_address)
{ISP_ENABLE();						//设置等待时间,允许ISP/IAP操作,送一次就够IAP_CONTR = 0X83;ISP_ERASE();						//宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令//只有扇区擦除,没有字节擦除,512字节/扇区。//扇区中任意一个字节地址都是扇区地址。ISP_ADDRH = EE_address / 256;		//送扇区地址高字节(地址需要改变时才需重新送地址)ISP_ADDRL = EE_address % 256;		//送扇区地址低字节EEPROM_Trig();						//触发EEPROM操作DisableEEPROM();					//禁止EEPROM操作
}//========================================================================
// 函数: void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u8 lenth)
// 描述: 读N个字节函数.
// 参数: EE_address:  要读出的EEPROM的首地址.
//       DataAddress: 要读出数据的指针.
//       length:      要读出的长度
// 返回: 0: 写入正确.  1: 写入长度为0错误.  2: 写入数据错误.
// 版本: V1.0, 2014-6-30
//========================================================================
void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u8 length)
{ISP_ENABLE();							//设置等待时间,允许ISP/IAP操作,送一次就够IAP_CONTR = 0X83;ISP_READ();								//送字节读命令,命令不需改变时,不需重新送命令do{ISP_ADDRH = EE_address / 256;		//送地址高字节(地址需要改变时才需重新送地址)ISP_ADDRL = EE_address % 256;		//送地址低字节EEPROM_Trig();						//触发EEPROM操作*DataAddress = ISP_DATA;			//读出的数据送往EE_address++;DataAddress++;}while(--length);DisableEEPROM();
}//========================================================================
// 函数: u8 EEPROM_write_n(u16 EE_address,u8 *DataAddress,u8 length)
// 描述: 写N个字节函数.
// 参数: EE_address:  要写入的EEPROM的首地址.
//       DataAddress: 要写入数据的指针.
//       length:      要写入的长度
// 返回: 0: 写入正确.  1: 写入长度为0错误.  2: 写入数据错误.
// 版本: V1.0, 2014-6-30
//========================================================================
u8 	EEPROM_write_n(u16 EE_address,u8 *DataAddress,u8 length)
{u8	i;u16	j;u8	*p;if(length == 0)	return 1;	//长度为0错误ISP_ENABLE();						//设置等待时间,允许ISP/IAP操作,送一次就够i = length;j = EE_address;p = DataAddress;ISP_WRITE();							//宏调用, 送字节写命令do{ISP_ADDRH = EE_address / 256;		//送地址高字节(地址需要改变时才需重新送地址)ISP_ADDRL = EE_address % 256;		//送地址低字节ISP_DATA  = *DataAddress;			//送数据到ISP_DATA,只有数据改变时才需重新送EEPROM_Trig();						//触发EEPROM操作EE_address++;						//下一个地址DataAddress++;						//下一个数据}while(--length);						//直到结束EE_address = j;length = i;DataAddress = p;i = 0;ISP_READ();								//读N个字节并比较do{ISP_ADDRH = EE_address / 256;		//送地址高字节(地址需要改变时才需重新送地址)ISP_ADDRL = EE_address % 256;		//送地址低字节EEPROM_Trig();						//触发EEPROM操作if(*DataAddress != ISP_DATA)		//读出的数据与源数据比较{i = 2;break;}EE_address++;DataAddress++;}while(--length);DisableEEPROM();return i;
}

🛠串口写入和读取操作

  • 🌿写入操作:W 0x0200 abcd9527
    在这里插入图片描述
  • 🌿读取操作:R 0x0200 14
    在这里插入图片描述
  • 🍁在第一个扇区写入数据:W 0x0000 去年今日此门中,人面桃花相映红。人面不知何处去,桃花依旧笑春风。
    在这里插入图片描述
  • 🍁读取第一个扇区数据:R 0x0000 70
    在这里插入图片描述

📚程序源码

  • 🔖本案例来源于STC实验箱4中的案例修改而来。
复制这段内容后打开百度网盘手机App,操作更方便哦
链接: https://pan.baidu.com/s/1Q5k8FONsXFhnaDBcE3jiOw
提取码: dhye

相关文章:

STC15系列单片机通过串口多字节数据读写EEPROM操作

STC15系列单片机通过串口多字节数据读写EEPROM操作&#x1f4cc;相关篇《STC15系列单片机EEPROM读写示例》 ⛳手册勘误信息注意事项 ⚡在手册上面描述STC15F2K60S2及STC15L2K60S2系列单片机内部EEPROM还可以用MOVC指令读&#xff0c;但此时首地址不再是0000H&#xff0c;而是程…...

计算机网络-ip数据报

在图中&#xff0c;网络层包含了四种协议&#xff1a;ARP、IP、ICMP、IGMP&#xff0c;由上下关系表明&#xff0c;ARP为IP协议服务&#xff0c;IP为ICMP和IGMP服务。 IP数据报格式 此处不区分数据报和分组的概念&#xff1a;当数据部分过长时&#xff0c;将数据部分拆分&…...

从零开始学C

以下是 该如何学习C语言的【思维导图】以及部分重点知识点的【博客链接】。其实C语言并不难&#xff0c;难的是没有人去教&#xff0c;没有耐心去学。不知道从哪下手学习&#xff0c;我将C的知识点做成一个思维导图&#xff0c;以供迷茫的小白参考&#xff0c;哪里不会&#xf…...

【云原生】手把手带你从零开始搭建kubernetes最新版本实战

文章目录前言一. 实验环境二. k8s 的介绍三 . k8s的安装3.1 搭建实验环境3.1.1 硬件层面的要求3.1.2 软件层面环境配置3.2 docker的安装3.2.1 搭建docker3.2.2 部署 cri-dockerd3.3 部署k8s3.3.1 配置添加阿里云的yum源3.3.2 安装kubeadm kubelet kubectl3.3.3 k8s-master节点初…...

trivy os软件包扫描原理分析

具体可以基于之前的博客来做 基于trivy获取基础镜像 参数修改一下&#xff1a; cliOpt.ListAllPkgs true 结果中会带有如下格式的结果&#xff1a; "Results":[{"Target":"192.168.1.94:443/test22/centos:7 (centos 7.9.2009)","Clas…...

算法训练营 day48 动态规划 完全背包 零钱兑换 II 组合总和 Ⅳ

算法训练营 day48 动态规划 完全背包 零钱兑换 II 组合总和 Ⅳ 完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物…...

Java 基础(1)—泛型简单使用

一、泛型定义及作用 泛型是一种编程机制&#xff0c;允许在编写代码时使用参数化类型&#xff0c;以在编译时实现类型安全。 以下是泛型作用&#xff1a; 增强代码可读性和可维护性&#xff1a;通过在代码中使用泛型参数&#xff0c;可以使代码更清晰、更具有可读性和可维护性…...

内存卡损坏了怎么恢复?

内存卡损坏了怎么恢复?现在我们身边有不少电子设备都是用存储卡来存储数据的。一旦需要方便我们直接导出使用。但这存储的数据也不是一定安全的&#xff0c;当我们将内存卡连接到电脑时&#xff0c;难免会碰到病毒、格式化等提示&#xff0c;在这些情况下&#xff0c;可能会导…...

Mysql使用规范(纯技术和实战建议)

1、事务隔级别: &#xff08;强制&#xff09;&#xff1a;Repeatable-Read&#xff08;重复读&#xff09;&#xff0c;且不能在会话操作时临时开启隔离级别。 注&#xff1a; Repeatable-Read&#xff08;重复读&#xff09;隔离级别解决不了幻读。 可用 show variables l…...

Netty源码解读-EventLoop(二)

一、简介 NioEventLoop的重要组成&#xff1a;Selector、线程、任务队列&#xff0c;他既会处理io事件&#xff0c;也会处理普通任务和定时任务. 1.下面是Selector&#xff0c;注意有两个哦后面会讲 2.下面的爷爷类提供的Thread变量&#xff0c;其实下面发excutor用的就是这个…...

OSI模型详解

今天&#xff0c;我们详解OSI&#xff08;Open System Inter-connection Reference Model&#xff09;模型&#xff0c;来看看工业物联网的网络互联和数据互通。 OSI模型 1984年&#xff0c;国际标准化组织&#xff08;International Organization for Standardization&#…...

Share Creators完成500万美元融资,以工具化手段帮助企业从数字资产管理中解放

近日&#xff0c;总部位于旧金山湾区的初创公司Share Creators宣布完成了新一轮500万美元的融资&#xff0c;投资方为五源资本和福昕PDF。本轮融资主要用于扩大客户基础&#xff0c;并加速在美国、欧洲和亚洲的业务发展。近几年&#xff0c;企业内容及数字资产管理全球市场正在…...

几个Base64编码工具,也有蹊跷

起因 需求&#xff1a;对一段内容进行base64加密&#xff0c;然后通过url的get请求进行发送到后台&#xff0c;由于加密的内容比较少&#xff0c;base64串也不是很长&#xff0c;我认为此方案可行。 于是找了三个base64编码的在线工具&#xff0c;分别是&#xff1a; 平台1&…...

Python|每日一练|排序|递归|字符串|数组|动态规划|单选记录:以特殊格式处理连续增加的数字|正则表达式匹配|地下城游戏

1、以特殊格式处理连续增加的数字&#xff08;排序&#xff09; 贡献者&#xff1a;EricLao 给出一串数字&#xff0c; 程序要把数字按照这样的格式输出&#xff0c;把连续增加的数字用 [x-y] 的形式表示&#xff0c;只显示这一组顺序数字的首位两个数字&#xff0c;不连续增…...

Spring Cloud微服务网关Gateway组件

目录 网关简介 什么是Spring Cloud Gateway Spring Cloud Gateway 功能特征 核心概念 工作原理 Spring Cloud Gateway快速开始 环境搭建 集成Nacos 路由断言工厂&#xff08;Route Predicate Factories&#xff09;配置 自定义路由断言工厂 过滤器工厂&#xff08; …...

cluster nodes(集群节点)

CLUSTER NODES 复制 自3.0.0起可用。 时间复杂度&#xff1a; O&#xff08;N&#xff09;其中N是 Cluster 节点的总数 Redis 集群中的每个节点都有其当前集群配置的视图&#xff0c;由已知节点的集合给出&#xff0c;我们与这些节点的连接状态&#xff0c;它们的标志&…...

【Android学习】下载jar慢和gradle慢的情况

目录 问题出现的原因 解决方法 解决Gradle下载问题&#xff1a;手动安装 解决jar包下载慢问题&#xff1a;更改下载源 问题出现的原因 国内访问谷歌被墙导致访问速度慢或者干脆无法下载 解决方法 解决Gradle下载问题&#xff1a;手动安装 访问官网Gradle | Release Candi…...

下一个排列-力扣31-java

一、题目描述整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地&…...

前端面试题

1.HTTP request报文结构是怎样的 1.首行是Request-Line包括&#xff1a;请求方法&#xff0c;请求URI&#xff0c;协议版本&#xff0c;CRLF&#xff08;换行符&#xff09; 2.首行之后是若干行请求头&#xff0c;包括general-header&#xff0c;request-header或者entity-hea…...

jsp游戏门户网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp 游戏门户网站系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使…...

Git与IDEA强强联合(HTTPS协议连接)

最近在写项目的时候&#xff0c;在台式机和笔记本之间频繁切换&#xff0c;竟然还是用qq传压缩包&#xff0c;我自己都感觉无语&#xff0c;有git这样强大的版本管理工具&#xff0c;我竟然没想起来。然后也没有相关的博文就想来更新一篇。 那么如何使idea和git强强联合呢&…...

leetcode 第二题:两数相加-C语言实现

题目地址 备注&#xff1a; 不要忘记最后一个进位的可能。可以使用typedef&#xff0c;来简化struct的书写 代码实现&#xff1a; #include<stdio.h> #include<stdlib.h>struct listNode {int val;struct listNode* next; };// 使用typedef typedef struct lis…...

【人工智能】PTP网络时钟服务器在智能驾驶里的重要性

【人工智能】PTP网络时钟服务器在智能驾驶里的重要性 【人工智能】PTP网络时钟服务器在智能驾驶里的重要性 一辆宣称具备L4/L5自动驾驶功能的车辆&#xff0c;如果多个激光雷达之间的时间同步不够精确&#xff1f;如果传感器感知数据通过以太网传输到智驾域控制器的延迟不可控…...

【蓝桥杯集训3】二分专题(3 / 5)

目录 二分模板 1460. 我在哪&#xff1f; - 二分答案 哈希表 1221. 四平方和 - 哈希表 / 二分 1、哈希表 2、二分 自定义排序 1227. 分巧克力 - 113. 特殊排序 - 二分模板 l r >> 1 —— 先 r mid 后 l mid1 —— 寻找左边界 —— 找大于某个数的最小值lr…...

在成都的哪个培训机构学习Java好呢?

自从小课06年进入成都这个IT培训市场以来&#xff0c;短短十几年&#xff0c;招过很多学员&#xff0c;也见证过很多机构的起起落落。心中有万分的感慨&#xff0c;总结下来有这几点分享给大家&#xff0c;在选择培训机构时能看清本质&#xff0c;找到适合自己靠谱的机构学Java…...

传输层重要协议之UDP协议和TCP协议详解

更多关于UDP协议和TCP协议请移步官网&#xff1a;https://www.rfc-editor.org/standards#ISUDP标准协议文档-RFC 768TCP标准协议文档-RFC 793UDP协议详解UDP协议的特点&#xff1a;无连接、不可靠传输、面向数据报和全双工。UDP协议报文结构&#xff1a;关于端口号&#xff1a;…...

BNB Greenfield 成存储赛道“新贵”,BNB 生态的野心与破局

“从BNB Beacon Chain&#xff0c;到BNB Chain&#xff0c;再到BNB Greenfield &#xff0c;三位一体的 BNB 生态格局正式形成。 ”在今年的2月1日&#xff0c;币安发布了分布式存储链BNB Greenfield&#xff0c;根据白皮书信息&#xff0c;它的特别之处在于其不仅具备基于SP&a…...

【SQL开发实战技巧】系列(十六):时间类型操作(上):日、月、年、时、分、秒之差及时间间隔计算

系列文章目录 【SQL开发实战技巧】系列&#xff08;一&#xff09;:关于SQL不得不说的那些事 【SQL开发实战技巧】系列&#xff08;二&#xff09;&#xff1a;简单单表查询 【SQL开发实战技巧】系列&#xff08;三&#xff09;&#xff1a;SQL排序的那些事 【SQL开发实战技巧…...

JavaScript知识点总结

JavaScript 一、介绍: 1.JavaScript是一种专门在浏览器编译并执行的编程语言 2.JavaScript处理用户与浏览器之间请求问题 3.JavaScript采用【弱类型编程语言风格】对【面向对象思想】来进行实现的编程语言 二、弱类型编程语言风格 VS 强类型编程语言风格 …...

adb命令记录

一、获取系统版本 adb shell getprop ro.build.version.release 二、手机文件拉取到电脑 adb命令 &#xff1a; adb pull source_path dest_path 示例&#xff1a; adb pull /sdcard/Movies/app_layout.txt ./ 从手机拉取app_layout.txt文件到当前路径。 三、电脑文件推送…...