学习笔记-沁恒第四讲-米醋
一,
语音模块:数据包发送
刷卡模块:数据包接收
AS608:数据包发送+接收
二,第三讲文件夹改成第四讲,工程也改成第四讲
三,目前在内存里面。保存新值,掉电会丢失
u8 password[6]={1,2,3,4,5,6}; //开锁密码
u8 password_cmd[6]={2,7,7,5,1,6}; //管理员密码
四,BY8301-16P
Flash里面存储语音,通过IO口/串口,播放哪一条
Micro USB的接口
五,芯片好坏验证:音频生成,导入
生成想要的语音
喇叭接上能响就行,正负接线影响不大,磁场往外振动,和往里面吸,能响就行
语音模块接上电脑后
导入BY8301语音更新工具(语音模块连接电脑自动打开)
(更新进去:把正在播放的去掉)
(更新慢原因:串口读写,擦写flash,校验)
IO口1到7对应0001.mp3~0007.mp3
给IO口低电平使能,验证模块好坏
六,语音模块BY8301-16P(不是语音芯片)有很多功能(音量加减,上一曲),要发数据包,来控制
操作码:比如0x31:调整音量,0x41:选择曲目
校验码:发送数据过程中,可能丢包(复杂的电磁环境中,数据可能跳变:一个0跳成1)
和校验
发两个数 和 跳变的话,和就不一定对了
11 12 23
数据跳变了就返回一个0什么的,要求重新发
参数1,2(十六进制):两个字节,0~65535
例如:
选择播放曲目指令为 7E 05 41 00 01 45 EF
长度 05 是这样得到:就是“05”,“41”,“00”,“01”,“45”5 位数长度;
校验码 45 是这样得到:
首先打开计算器选择程序员模式;
然后选择 16 进制、双字;
最后点击进行计算(除去起始码和结束码) 05 Xor 41 Xor 00 Xor 01 = 45
- 串口接Rx 好坏验证:能不能接收数据包
共地
电脑给芯片发
7E 05 41 00 01 45 EF播放0001
7E 05 41 00 02 46 EF播放0002
八,必须要有中断函数
单片机操作数据包
串口:发送数据/接收数据 都会进中断
中断服务函数里判断 是发送中断 还是 接收中断
//串口3中断(发送中断+接收中断)
void USART3_IRQHandler(void)
{
u8 temp;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
temp=USART_ReceiveData(USART3);
}
USART_ClearITPendingBit(USART3, USART_IT_RXNE);
}
没有的话:发送完数据,触发了中断,找不到中断函数,指向不确定的地方(代码只能执行一次)
所以,触发中断后,判断一下发送中断 还是 接收中断:只用发送,也得有
九,硬件层,驱动层,应用层
十,串口发送完的标志位USART_FLAG_TC用于查询方式串口 发数据
void audio_init()
{
Usart3_Init();
}
void audio_play(u8 num)//查询写
{
u8 string[]={0x7e,0x05,0x41,0x00,num,0x05^0x41^0x00^num,0xef};
u8 i;
for(i=0;i<7;i++)
{
USART_SendData(USART3,string[i]);
while( USART_GetFlagStatus(USART3, USART_FLAG_TC)==0 );
//单片机96M的频率,串口慢,需要给单片机减速,但用delay太低级
}
}
十一,单片机 通过串口 向语音模块 发送一串数据,第一个数据语音模块没接收到
发送0x7e,0x05,0x41,0x00,0x05,0x05^0x41^0x00^0x05,0xef
收到 0x05,0x41,0x00,0x05,0x05^0x41^0x00^0x05,0xef
原因:
上电初始化时,
发送标志位USART_FLAG_TC就是1,
第一次发送的时候,显示已经发送完成了,跳过第一次发送,跳过while
(跳过while但跳不过Delay,但Delay太低级)
解决方法1:
void Usart3_Init()的最后
USART_ClearFlag(USART3,USART_FLAG_TC);//清空串口3的发送标志位
解决方法2:
考试的时候 只知道 第一个数据丢了,但不知道为什么:
那就第一个数据发两次
十二,CH32不支持位寻址,不能用bit
十三,设置输入正确密码开锁,5秒后自动关锁
十四,key_temp最后一位得不是0~9
u8 password[6]={1,2,3,4,5,6}; //开锁密码
u8 password_cmd[6]={2,7,7,5,1,6}; //管理员密码
u8 key_temp[7]={10,10,10,10,10,10}; //按键暂存区
u8 key_index; //按键索引,已经输入的密码位数
u8 key_index_old; //同上
假如开锁密码是268390
输入了 26839后最后一位默认是0,没输入门就开了
所以u8 key_temp[7]={10,10,10,10,10,10};
按键是0~9
十五,密码输入完开门后,得清空密码
#include "string.h" //数组函数相关头文件
void * memset (void *, int, size_t);
数组,要复制数组的数字,复制几位
void key_clear()//键盘暂存区清空函数
{
memset(key_temp,10,6);
key_index=0;
}
- 按键回退
if(key_index)
{
key_index--;
key_temp[key_index]=10;
}
按键清空key_clear();
十七,密码输入错误3次,锁定
u8 password_error; //密码错误次数
u16 time15s=15; //密码错误锁定倒计时15秒
/*按键处理函数*/
void key_proc()
{
if(password_error==3)return;锁定
switch(key_down)
{
case 16://确认按键
if( string_chek(key_temp,password,6) )密码输入正确
{
lock_flag=0;//开门
show_flag=1;//显示汉字们已开启
audio_play(3);//播放语音
key_clear();//清空状态
password_error=0;
}
else 密码输入错误
{
audio_play(4);//播放语音
key_clear();
if(++password_error==3)
{
audio_play(5);
show_flag=2;
}
}
break;//确认按键的Brak
}
}
/*系统计时定时器3中断服务函数*/
void TIM3_IRQHandler(void)//每1毫秒
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET)
{
if(password_error==3)//如果密码错误3次
{
if(--time15s==0)//15秒倒计时
{
time15s=15000;
password_error=0;//密码错误次数归零
show_flag=0;
}
}
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
十八,发生变化的时候,更新,(如果一直更新,会闪烁)
u8 show_flag; //显示汉字标志位
u8 show_flag_old; //显示汉字标志位
按键里面操作/其他地方操作,改flag就行
{“门”,0x04,0x00,0xC8,0x3F,0x08,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x28,0x02,0x10},/*"门",0*/
{“以”,0x00,0x08,0x20,0x08,0x44,0x08,0x84,0x08,0x84,0x08,0x04,0x08,0x04,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x24,0x02,0x14,0x0A,0x0C,0x11,0x84,0x20,0x40,0x40,0x20,0x40},/*"以",1*/
{“开”,0x00,0x00,0xFE,0x3F,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0xFF,0x7F,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x08,0x04,0x08,0x04,0x04,0x04,0x02,0x04},/*"开",2*/
{“启”,0x80,0x00,0x00,0x01,0xF8,0x3F,0x08,0x20,0x08,0x20,0x08,0x20,0xF8,0x3F,0x08,0x00,0x08,0x00,0x08,0x00,0xE8,0x3F,0x24,0x20,0x24,0x20,0x22,0x20,0xE1,0x3F,0x20,0x20},/*"启",3*/
{“,”,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x08,0x00,0x04,0x00,0x00,0x00},/*",",4*/
{“欢”,0x00,0x01,0x00,0x01,0x3F,0x01,0x20,0x3F,0xA0,0x20,0x92,0x10,0x54,0x02,0x28,0x02,0x08,0x02,0x14,0x05,0x24,0x05,0xA2,0x08,0x81,0x08,0x40,0x10,0x20,0x20,0x10,0x40},/*"欢",5*/
{“迎”,0x00,0x00,0x04,0x01,0xC8,0x3C,0x48,0x24,0x40,0x24,0x40,0x24,0x4F,0x24,0x48,0x24,0x48,0x24,0x48,0x2D,0xC8,0x14,0x48,0x04,0x08,0x04,0x14,0x04,0xE2,0x7F,0x00,0x00},/*"迎",6*/
{“回”,0x00,0x00,0xFC,0x1F,0x04,0x10,0x04,0x10,0xE4,0x13,0x24,0x12,0x24,0x12,0x24,0x12,0x24,0x12,0x24,0x12,0xE4,0x13,0x04,0x10,0x04,0x10,0xFC,0x1F,0x04,0x10,0x00,0x00},/*"回",7*/
{“家”,0x40,0x00,0x80,0x00,0xFE,0x7F,0x02,0x40,0x01,0x20,0xFE,0x3F,0x40,0x00,0xB0,0x10,0x8E,0x09,0x40,0x05,0x30,0x03,0x8E,0x05,0x60,0x19,0x18,0x61,0x47,0x01,0x80,0x00},/*"家",8*/
/*屏幕处理函数*/
void lcd_proc()
{
/*黄色密码输入区,*显示*/
//输入密码,更新key_index
if(key_index!=key_index_old) //如果暂存区位数发生了变化
{
u8 i=key_index;
LCD_Fill(16,45,112,66,YELLOW);//填充黄色背景
if(key_index==7)key_index=6; //限位,防止数组越界
while(i--)//循环显示*
{
if(i<6)
LCD_ShowChar(20+16*i,45,'*',RED,YELLOW,16,0);
}
key_index_old=key_index; //更新索引值
}
/*屏幕顶部白色字符显示区*/
if(show_flag!=show_flag_old)显示模式变化时,刷新白色区域
{
LCD_Fill(0,0,128,32,WHITE);//填充白色:闪的原因,所以放里面
show_flag_old=show_flag;
}
switch(show_flag)这一部分实时刷新
{
case 0://门已上锁
lcd_show_chinese(0,0,"门已上锁,请输入密码",RED,WHITE,16,0);
break;
case 1:
lcd_show_chinese(0,0,"门已开启,欢迎回家",RED,WHITE,16,0);
x,y,字符串,字色RED,背景色WHITE,字号16,非叠加模式
break;
case 2://锁定倒计时
LCD_ShowIntNum(50, 16,time15s,2, RED,WHITE,16);
x,y,数字,显示两位,字色RED,背景色WHITE,字号16
break;
}
}
- 确认按键要复用
u8 mode;
//模式,0主页,1修改密码没有解锁管理员权限,2修改密码模式解锁了管理员权限
//3录入卡片,没有解锁管理员权限 4录入卡片,解锁了管理员权限
u8 password[6]={1,2,3,4,5,6}; //开锁密码
u8 password_cmd[6]={2,7,7,5,1,6}; //管理员密码
u8 key_temp[7]={10,10,10,10,10,10}; //按键暂存区
u8 key_index; //按键索引,已经输入的密码位数
u8 key_index_old; //同上
二十,主页模式下,如果密码输入一半,突然要改密码(进入修改密码模式),得清空一次暂存区
二十一,RFID卡坏不坏验证:串口调试
喇叭:单片机告诉喇叭,你播放哪个(单片机Tx接喇叭Rx)
RFID:刷卡,RFID告诉单片机卡号是什么(RFID的Tx接单片机Rx)
卡层:
把卡放上去,模块会通过串口发卡号出来
单片机层面:
怎么改卡里面的密码,怎么读写卡(把卡里面的扇区改掉),储存新的卡,解锁匹配
接线:
RFID的Tx接Rx
VIN接VCC
GD接GND
二十二,RFID卡要求
XH36050-A1读写器规格书:工作电压:直流 3.3V-5V ,(最大输入电压不超过 6V)
高频读写器系列使用手册V1.3
波特率可以猜:RFID上刷卡,
每次显示的数据不一样,
明显是一个数据包,却每次刷卡只显示一个两个。
那就是波特率有问题
二十三,数据手册阅读方法
两张卡片分别刷一次,
显示04 0C 02 30 00 04 00 6E B9 92 D6 52
显示04 0C 02 30 00 04 00 C3 70 A2 00 10
明显看出前面是包头,后面是卡号
数据手册里搜一下0x04
二十四,RFID与喇叭共用串口3是不行的:因为两者需要的波特率不一样
串口3接收功能:RFID(RFID的Tx接单片机PB11)
串口3发送功能:喇叭
USART2的Rx:PA3
Tx:PA2
二十五,调试:串口1打印
不管校验,就当是对的
#include "debug.h" //必要系统头文件
USART_Printf_Init(115200);//串口1初始化
串口号选择WCH-Link 板载的串口
打开串口
1,验证能不能打印printf(“hellow\r\n”);(不加换行,不能正常打印(可能通过捕捉\r\n把前面的打印))
2,验证能不能进中断
二十六,录入卡片,刷录入的卡,能直接开锁
u8 mode;
//模式,0主页,1修改密码没有解锁管理员权限,2修改密码模式解锁了管理员权限
//3录入卡片,没有解锁管理员权限 4录入卡片,解锁了管理员权限
u8 rfid_index; //刷卡模块接收索引
u8 rfid_temp[4]={0}; //卡号暂存数组
u8 rfid[4][4]={0}; //卡片存储,二维数组,前一个中括号是第几张能开锁的卡
u8 rfid_password_index; //卡片存储索引(第几张卡)
二十七,RFID卡,USART2中断,捕获并解析数据包
void USART2_IRQHandler(void)
{
u8 temp;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
temp=USART_ReceiveData(USART2);
switch(rfid_index)
{
case 0:
if(temp==0x04)rfid_index++;
printf(“1\r\n”);
break;
case 1:
if(temp==0x0c)rfid_index++;
else rfid_index=0;
printf(“2\r\n”);
break;
case 2:
if(temp==0x02)rfid_index++;
else rfid_index=0;
printf(“3\r\n”);这个printf的过程,会干扰接收,能显示1,2,就把前两个printf删了
break;
case 3:
if(temp==0x30)rfid_index++;
else rfid_index=0;
break;
case 4:
if(temp==0x00)rfid_index++;
else rfid_index=0;
break;
case 5:
if(temp==0x04)rfid_index++;
else rfid_index=0;
break;
case 6:
if(temp==0x00)rfid_index++;
else rfid_index=0;
break;
case 7:
rfid_temp[0]=temp;
rfid_index++;
break;
case 8:
rfid_temp[1]=temp;
rfid_index++;
break;
case 9:
rfid_temp[2]=temp;
rfid_index++;
break;
case 10:
rfid_temp[3]=temp;
rfid_index=0;
接收完数据后
if(mode==0)主页模式下
{
if( rfid_chek() )如果卡片ID正确(四张卡片符合谁)
{
audio_play(11);
lock_flag=0;
}
else如果卡片ID错误
{
audio_play(12);
}
}
if(mode==4)录入卡片,解锁了管理员权限
{
将新卡的ID录入二维数组rfid[4][4]
string_copy(rfid_temp,rfid[rfid_password_index],4);
audio_play(15);
录入后,回主页模式
mode=0;
不自增的话:
rfid_chek()里for (i=0; i<rfid_password_index; ++i),循环不到刚录入的
而且无法录入更多
rfid_password_index++;
}
break;
}
}
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}
检查录入的卡片 与 正在刷的卡片,ID相同不
u8 rfid_chek()
{
u8 i;
for (i=0; i<rfid_password_index; ++i)
{
if( string_chek(rfid_temp,rfid[i],4) )return 1;
}
return 0;
}
二十七,二维数组和一维数组,在内存中的存储是一样的
寻址方式不同,本质是一串地址
一维数组,直接偏移
二维数组,偏移量乘起来
num[0][6]=7
1 2 3
4 5 6
7 8 9
if( string_chek(rfid_temp,rfid[i],4) )return 1;
相关文章:
学习笔记-沁恒第四讲-米醋
一, 语音模块:数据包发送 刷卡模块:数据包接收 AS608:数据包发送接收 二,第三讲文件夹改成第四讲,工程也改成第四讲 三,目前在内存里面。保存新值,掉电会丢失 u8 password[6]{1,…...
epoll_event的概念和使用案例
epoll_event 是 Linux 下 epoll I/O 多路复用机制的核心数据结构,用于描述文件描述符(File Descriptor, FD)上发生的事件及其关联的用户数据。通过 epoll,可以高效地监控多个文件描述符的状态变化(如可读、可写、错误等…...
容器和虚拟机选择对比
1. 概述 如果主要需求是学习和测试 Ubuntu 下的命令行工具或服务型应用,推荐使用 Docker Docker 更轻量、更高效,适合快速搭建和销毁环境。 启用 WSL 2,Docker Desktop 是一个非常好的选择。 如果需要完整的桌面环境或进行复杂的系统级开…...
C++17中std::chrono::duration和std::chrono::time_point的舍入函数
文章目录 1. std::chrono::duration的舍入函数1.1 floor1.2 ceil1.3 round 2. std::chrono::time_point的舍入函数2.1 示例 3. 舍入函数的应用场景3.1 时间测量3.2 数据记录3.3 时间同步 4. 总结 在C17中, std::chrono库提供了一组强大的时间处理工具,包…...
基于SpringBoot的线上汽车租赁系统的设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
基于Dancing Links的精确覆盖算法(解决NP难问题)和量子计算机模拟中的Shor算法(涉及数论与量子叠加态模拟)
一、Dancing Links算法实现数独求解(NP难问题) 算法方案 数独可转化为精确覆盖问题,使用Knuth提出的DLX算法实现高效求解。该算法通过双向十字循环链表实现快速回溯,时间复杂度可达O(n^k)(k为常数) #include <iostream> #include <vector> #include <c…...
体育品牌排行榜前十名:MLB·棒球1号位
MLB是一个融合了棒球文化与街头时尚元素的潮流运动品牌。以下是对该品牌的详细介绍: 一、品牌背景 • 全称:MLB全称是Major League Baseball,即美国职业棒球大联盟。不过,作为品牌的MLB并非由美国职业棒球大联盟直接运营&#x…...
Java网络编程封装
系列文章目录 Java知识点 文章目录 系列文章目录👉前言👉一、封装的目标👉二、套接字层封装👉壁纸分享👉总结 👉前言 Java 网络编程封装原理主要围绕着将底层的网络通信细节隐藏起来,提供简洁…...
数字内容体验标杆案例解析
内容概要 在数字化转型浪潮中,数字内容体验正成为企业构建核心竞争力的关键抓手。本文通过拆解金融、零售、文旅等领域的标杆案例,系统分析沉浸式设计与智能交互系统的技术融合路径,揭示头部企业如何通过XR技术、实时数据可视化及场景化内容…...
区块链相关方法-PEST分析
一、定义:一种用于分析企业外部宏观环境的工具。PEST 这四个字母分别代表政治(Political)、经济(Economic)、社会(Social)和技术(Technological)。这种分析方法帮助企业或组织了解宏…...
Dify安装教程:Linux系统本地化安装部署Dify详细教程
1. 本地部署 Dify 应用开发平台 环境:Ubuntu(24.10) docker-ce docker compose 安装 克隆 Dify 源代码至本地环境: git clone https://github.com/langgenius/dify.git 启动 Dify: cd dify/docker cp .env.example...
git使用-克隆远程项目、分支管理
文章目录 克隆远程项目到本地1. 远程找到需要克隆的项目,复制ssh地址2. idea开启git版本控制(如果已经开了,忽略此步骤)3. clone远端项目4. 克隆完成 分支管理1. 新建分支2. 切换分支3. 合并分支4. 储存变化 克隆远程项目到本地 …...
QT 引入Quazip和Zlib源码工程到项目中,无需编译成库,跨平台,压缩进度
前言 最近在做项目时遇到一个需求,需要将升级的文件压缩成zip,再进行传输; 通过网络调研,有许多方式可以实现,例如QT私有模块的ZipReader、QZipWriter;或者第三方库zlib或者libzip或者quazip等࿱…...
SQLMesh 系列教程8- 详解 seed 模型
在数据分析和建模过程中,外部模型(External Models)在 SQLMesh 中扮演着重要角色。外部模型允许用户引用外部数据源或现有数据库表,从而实现灵活的数据整合和分析。本文将介绍外部模型的定义、生成方法(包括使用 CLI 和…...
oracle apex post接口
日常记录 使用到了apex_json方式接收 、、、1 首先,接口通过body传递过来,成功接收到, 数据格式为 JSON_OBJECT_T l_json : JSON_OBJECT_T.parse(:body); 这里我用参数接收到 然后 里面是包含了 "data" 我用 继续接收到这个 l…...
复制所绑定元素文本的vue自定义指令
最近写了一个复制所绑定元素文本的vue自定义指令,给大家分享一下。 import { ElMessage } from element-plus// data-* 属性名 const dataCopyBtnTextAttribute data-copy-btn-text // 复制按钮的class,结合项目实际进行设置 const copyBtnClass icon…...
若依-@Excel新增注解numberFormat
Excel注解中原本的scale会四舍五入小数,导致进度丢失 想要的效果 显示的时候保留两个小数真正的数值是保留之前的数值 还原过程 若以中有一個專門的工具类,用来处理excel的 找到EXCEL导出方法exportExcel()找到writeSheet,写表格的方法找到填充数据的方法…...
内容中台重构智能服务:人工智能技术驱动精准决策
内容概要 现代企业数字化转型进程中,内容中台与人工智能技术的深度融合正在重构智能服务的基础架构。通过整合自然语言处理、知识图谱构建与深度学习算法三大技术模块,该架构实现了从数据采集到决策输出的全链路智能化。在数据层,系统可对接…...
网络安全:DeepSeek已经在自动的挖掘漏洞
大家好,我是AI拉呱,一个专注于人工智领域与网络安全方面的博主,现任资深算法研究员一职,兼职硕士研究生导师;热爱机器学习和深度学习算法应用,深耕大语言模型微调、量化、私域部署。曾获多次获得AI竞赛大奖,拥有多项发明专利和学术论文。对于AI算法有自己独特见解和经验…...
C#从入门到精通(34)—如何防止winform程序被同时打开多次
前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发上位机软件的过程中,评判一个人软件写的好不好,有一…...
Linux系统使用Docker部署Geoserver并做数据挂载进行地图服务的发布和游览
文章目录 1、前提环境2、拉取geoserver镜像3、创建数据挂载目录4、 运行容器5、 测试使用(发布shp数据为服务)5.1、创建工作区5.2、添加数据存储5.3、发布图层5.4、服务游览 1、前提环境 部署环境:Linux,Centos7 ,Doc…...
STM32-温湿度上传OneNET项目
一、项目需求 使用 ESP8266 连接 OneNET 云平台,并通过 MQTT 协议上传 DHT11 获取的温湿度值。 二、项目框图 三、DHT11工作原理 参考于良许嵌入式手把手教你玩转DHT11(原理驱动) | 良许嵌入式 3.1 正常工作验证 # 上电后ÿ…...
HTML 中的 Canvas 样式设置全解
在 HTML5 中,<canvas> 元素提供了一个强大的绘图接口,允许开发者通过 JavaScript 实现各种图形和动画效果。为了充分利用 <canvas> 的功能,理解其样式设置是至关重要的。本文将详细介绍如何在 HTML 中设置 <canvas> 的各种…...
【Java】File 类
目录 File 类File 类构造方法常见成员方法判断与获取创建与删除获取并遍历 File 类 File 对象表示一个路径,可以是文件的路径,也可以是文件夹的路径 这个路径可以是存在的,也允许是不存在的 绝对路径和相对路径的区别: 绝对路径…...
SAP S4HANA Administration (Mark Mergaerts Bert Vanstechelman)
SAP S4HANA Administration (Mark Mergaerts Bert Vanstechelman)...
特征提取:如何从不同模态中获取有效信息?
在多模态学习中,特征提取是一个至关重要的过程。它是将原始数据(如文本、图像、视频和语音等)转化为机器能够理解和处理的特征的核心步骤。不同于传统的单一模态任务,在多模态学习中,如何有效地从每种模态中提取出有意义的信息并进行融合,直接影响到最终模型的性能和准确…...
2025年-G14-Lc88-278.第一个坏版本 -java版
1.题目描述 第一个坏版本 你是一名产品经理,目前领导一个团队开发新产品。不幸的是,你产品的最新版本未通过质量检查。由于每个版本都是基于前一个版本开发的,所以坏版本之后的所有版本也都是坏的。假设你有 n 个版本 [1, 2, …, n]ÿ…...
计算机网络————(一)HTTP讲解
基础内容分类 从TCP/IP协议栈为依托,由上至下、从应用层到基础设施介绍协议。 1.应用层: HTTP/1.1 Websocket HTTP/2.0 2.应用层的安全基础设施 LTS/SSL 3.传输层 TCP 4.网络层及数据链路层 IP层和以太网 HTTP协议 网络页面形成基本 流程:…...
大语言模型架构:从基础到进阶,如何理解和演变
引言 你可能听说过像 ChatGPT 这样的 AI 模型,它们能够理解并生成自然语言文本。这些模型的背后有着复杂的架构和技术,但如果你了解这些架构,就能明白它们是如何工作的。今天,我们将用简单的语言,逐步介绍大语言模型的…...
科普mfc100.dll丢失怎么办?有没有简单的方法修复mfc100.dll文件
当电脑频繁弹窗提示“mfc100.dll丢失”或应用程序突然闪退时,这个看似普通的系统文件已成为影响用户体验的核心痛点。作为微软基础类库(MFC)的核心组件,mfc100.dll直接关联着Visual Studio 2010开发的大量软件运行命脉。从工业设计…...
什么是虚拟内存?它的作用是什么?
虚拟内存概念 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间)。但是实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在…...
SAP任命Simon Davies为亚太区总裁,领导重组后的亚太地区业务
2025年2月19日,SAP宣布任命Simon Davies为新任亚太区总裁,负责领导公司重组后的亚太地区业务。Davies将常驻新加坡,全面负责SAP在亚太地区的战略、运营、人员管理、销售、服务、合作伙伴关系及盈利能力。他的职责范围涵盖韩国、澳大利亚、新西…...
Markdown使用方法文字版解读
[TOC](这里写自定义目录标题) # Markdown编辑器 你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 ## 新的改变 我们对Markdown编辑器进行了…...
QT移植,交叉编译至泰山派RK3566开发板,.pro文件解析
备注 交叉编译到开发板,会有各种奇奇怪怪的问题, 直接命令行安装 QTCREATOR和 QtBase,就在板子上搞个桌面系统编译,最后把桌面关掉。 配置文件解析 配置文件丢这里,后面有空整理下。 说下大概的注意点, 安装路径(qtcreator远程部署的路径)、 动态库路径和…...
Liunx(CentOS-6-x86_64)系统安装MySql(5.6.50)
一:安装Liunx(CentOS-6-x86_64) 安装Liunx(CentOS-6-x86_64) 二:下载MySql(5.6.50) MySql下载官网 二:安装MySql 2.1 将mysql上传到Liunx 文件地址 /usr/local/ 2…...
使用 deepseek实现 go语言,读取文本文件的功能,要求支持 ascii,utf-8 等多种格式自适应
使用 deepseek实现 go语言,读取文本文件的功能,要求支持 ascii,utf-8 等多种格式自适应我要用 chatgpt,也问过,但是比 deepseek 还是差一个级别,具体如下: package mainimport ("bufio&qu…...
当电脑上有几个python版本Vscode选择特定版本python
查看当前vscode用的python版本命令 Import sys print(sys.version) 修改VSCODE解释器 打开 VSCode。 按下 CtrlShiftP打开命令面板。 输入 Python: Select Interpreter 并选择它。 从弹出的列表中选择你安装的 Python 解释器。如果你有多个 Python 版本(例如…...
大一计算机的自学总结:一维差分与等差数列差分
前言 差分和前缀和一样,也是很重要的基础算法。 一、一维差分 1.内容 当给出一个数组,每次操作让数组某个区间上的值全增加,最后要求返回整个数组的结果。若是一次一次去遍历,时间复杂度肯定很难看。差分可以做到在时间复杂度…...
学习dify第一天:整体架构分析
使用marscode AI插件 从分析最火的dify开始学习使用ai提速首先安装插件功能快捷键使用这个工具如何学习项目首先学习dify那就先上官网看文档开始从docker构建脚本学起看下docker-compose.yamldify里边服务的组件现在看api和web模块api项目根目录有Makefile文件,用于构建api和w…...
C语言的内存分配:malloc和free
使用库函数分配和管理内存。在运行时,分配更多的内存给程序使用,主要工具是malloc函数,这个函数接受一个参数:所需要要的内存字节数。malloc函数会找到合适的空闲内存块,这样的内存是匿名的,即malloc分配了…...
为什么 JSON 不能序列化 set
为什么 JSON 不能序列化 set JSON(JavaScript Object Notation)作为一种广泛使用的数据交换格式,虽然功能强大,但它无法直接序列化 set 类型。本文将从设计原理、实现限制和实际应用角度,探讨这一现象的原因及解决方案…...
XUnity.AutoTranslator-Gemini——调用Google的Gemini API, 实现Unity游戏中日文文本的自动翻译
XunityAutoTranslator-Gemini-API 本项目是一个使用 Flask 框架和 Google Gemini GenAI 模型构建的 Web API 服务,用于将日文unity游戏文本翻译成简体中文。 日文游戏文本AI翻译API (基于Google Gemini) 本项目是一个使用 Flask 框架和 Google Gemini GenAI 模型…...
深刻理解构件生产线
我们可以将构件生产线类比为软件开发中的一种高效、模块化的构建方式。下面,我将结合Java编程的概念来详细讲解构件生产线的含义和实现方式。 一、构件生产线的概念 构件生产线在软件开发中,类似于工厂中的自动化生产线,它通过将复杂的软件…...
nlp 自然语言处理+bert model +问答系统 question answer system(python 完整代码)
pre-trained bert model 预训练好的Bert模型 本地实现问答系统 用这条命令将bert下载到本地: model.save_pretrained("path/to/model") 也有参考这篇文章 https://colab.research.google.com/drive/1uSlWtJdZmLrI3FCNIlUHFxwAJiSu2J0-#scrollTo=AaweLnNXGhTY …...
【Excel】【VBA】根据内容调整打印区域
Excel VBA:自动调整打印区域的实用代码解析 在Excel中,我们经常需要调整打印区域。今天介绍一段VBA代码,它可以根据C列的内容自动调整打印区域。 Dim ws As Worksheet Dim lastRow As Long Dim r As Long 设置当前工作表 Set ws ActiveSh…...
【读书笔记·VLSI电路设计方法解密】问题53:什么是逻辑综合
逻辑综合是将期望的电路行为的抽象形式(通常以RTL表示)转换为基于逻辑门(标准单元)的设计实现的过程。这一过程由具有复杂算法的自动综合工具完成。逻辑综合的结果是网表,它由各种标准单元和特殊宏单元组成。该网表的功…...
Redis 的备份机制
Redis 的备份机制 Redis 是一个高性能的基于内存的键值存储数据库,虽然所有操作都在内存中完成,但 Redis 也提供了持久化机制来确保数据的可靠性和可恢复性。这主要通过 RDB 和 AOF 两种备份机制实现。 RDB(Redis Database Backupÿ…...
CountDownlatch实现原理
文章目录 类图及概要核心方法await() 方法await(long timeout, TimeUnit unit) 方法countDown() 方法getCount() 方法 总结 类图及概要 CountDownLatch 内部有个计数器,并且这个计数器是递减的 。 下面就通过源码看看 JDK 开发组在何时初始化计数器,在何…...
如何为自己的 PDF 文件添加密码?在线加密 PDF 文件其实更简单
随着信息泄露和数据安全问题的日益突出,保护敏感信息变得尤为重要。加密 PDF 文件是一种有效的手段,可以确保只有授权用户才能访问或修改文档内容。本文将详细介绍如何使用 CleverPDF 在线工具为你的 PDF 文件添加密码保护,确保其安全性。 为…...
现代未来派品牌海报徽标设计无衬线英文字体安装包 THANKS LAB
THANK LAB 是一种高级未来主义的软字体,将时尚的现代设计与光滑圆润的边缘相结合,营造出大胆而平易近人的美感。这款字体非常适合品牌、海报、标题、UI/UX 和科幻主题项目,旨在激发创造力。THANK LAB Futuristic Soft Font 完全支持拉丁字母、…...