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

学习笔记-沁恒第五讲-米醋

一,设置音量

上次

这次

#include "uart.h"

#include "debug.h"

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 );

   }

}

void audio_yinliang(u8 yinliang)

{

    u8 string[]={0x7e,0x04,0x31,yinliang,0x04^0x31^yinliang,0xef};

      u8 i;

      for(i=0;i<6;i++)

      {

          USART_SendData(USART3,string[i]);

          while(  USART_GetFlagStatus(USART3, USART_FLAG_TC)==0 );

      }

}

二,要delay,不然会跳过 audio_play(2);

中间没有断,下一条指令收不到

    audio_yinliang(20);

    Delay_Ms(10);

audio_play(2);

这两函数本质都是:通过串口三,往DR写入一串数据

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 );

   }

}

void audio_yinliang(u8 yinliang)

{

    u8 string[]={0x7e,0x04,0x31,yinliang,0x04^0x31^yinliang,0xef};

      u8 i;

      for(i=0;i<6;i++)

      {

          USART_SendData(USART3,string[i]);

          while(  USART_GetFlagStatus(USART3, USART_FLAG_TC)==0 );

      }

}

三,AS608指纹识别模块用户手册 - 看电压,接线

  1. 看怎么接线,电压规格

红色:VIN

黄线:Tx

白线:Rx

黑线:GND

WAK:随便接个GPIO(七,怎么检查模块上有无指纹)

供电Vt:供几伏就是几伏,但高了可能会烧

四,AS608是不是好的:用上位机验证

验证AS608本身 和 AS608的串口 是好是坏

带上位机,用上位机测试:用串口收发(封装好了各种收发的数据包,还有图形界面化)

先接线

Usb转TTL模块(CH340可能会有问题,还得是CH341)

打开串口

获取(指纹)图像,看看获取成功没

五,拿到一个传感器,无手册(不知道数据包是什么),只有上位机

疑问:指纹模块收到指纹数据,发给上位机,收发数据包什么格式?

解决方法1:

下载一个串口监控精灵:看到上位机和指纹模块之间的通信

解决方法2:

面包板从硬件上直接截取中间发送的数据去监控

  • 抄个串口7:Tx是PC2,Rx是PC3

  • 怎么检查模块上有无指纹:

按下时,才触发一下,手指触摸到指纹模块,引脚就是高电平,上面没手指,就是低电平

八,AS608波特率可调,初始115200

九,串口七输出的同时,但因为我看不到,在用串口一打印出来,看看到底发了啥

点开SSCOM,选择WCH-Link,用单片机的串口一调试:因为复杂数据包的收发,一定要实时看到,

十,串口七发送字符串,手动给长度好一点

检查’\0’,停止发送:遇到这个就只发送{1,2,3}String[]={1,2,3,0,5,6};

然后printf的0也打印不出来(认为检测到\0),0后面的也丢了

数组首地址 数组长度

void uart7_send_string(u8* string,u8 len)

{

    u8 i;

    for(i=0;i<len;i++)

    {

        USART_SendData(UART7,string[i]);

        while(  USART_GetFlagStatus(UART7, USART_FLAG_TC)==0 );

}

printf(%s\r\n,string);printf的0也打印不出来(认为检测到\0),0后面的也丢了

}

解决方法:

//打印出来:可以看到

void usart1_send_string(u8* string,u8 len)

{

    u8 i;

    for(i=0;i<len;i++)

    {

        USART_SendData(USART1,string[i]);

        while(  USART_GetFlagStatus(USART1, USART_FLAG_TC)==0 );

    }

}

//发给指纹模块:你看不到

void uart7_send_string(u8* string,u8 len)

{

    u8 i;

    for(i=0;i<len;i++)

    {

        USART_SendData(UART7,string[i]);

        while(  USART_GetFlagStatus(UART7, USART_FLAG_TC)==0 );

    }

    usart1_send_string(string,len);串口一打印出来,看看串口七到底发了啥

}

  • 单片机收到的数据包,不定长,怎么确定数据包接收完成,什么时候让接收指针清零,(疑问:AS608收到单片机发的不定长数据,是怎么接收的?)

解决方法:超时解析

如果10ms没接收到新字符,说明这数据包发完了

u8 uart7_rec_string[20]={0};

u8 uart7_rec_index;

u8 uart7_rec_tick;每1ms++

/*串口7中断*/

void UART7_IRQHandler(void)

{

    u8 temp=0;

    if(USART_GetITStatus(UART7, USART_IT_RXNE) != RESET)

       {

        ps_wait_flag=0;

        if(uart7_rec_tick>10)uart7_rec_index=0;

        temp=USART_ReceiveData(UART7);

        uart7_rec_string[uart7_rec_index]=temp;

        uart7_rec_index++;

        uart7_rec_tick=0;

       }

    USART_ClearITPendingBit(UART7, USART_IT_RXNE);

}

十二,AS60x指纹识别SOC用户手册V10 - 具体的指令

十三,指纹模块大概内部结构

buffer1

传感器 暂存区 flsh指纹库

buffer2

十四,录入指纹流程:(也可以只存一次到buffer1,不融合,直接存到flash指纹库里)

按两次指纹 登录一个模板存于 flash 指纹库

手指放传感器上:

第一次:

能调用函数PS_GetImage,传感器上的指纹 读取到 暂存区(数字量)

PS_Genchar暂存区指纹的图像数据 转换成 指纹特征数据:

存在buffer1

第二次(两次存的一样)

能调用函数PS_GetImage,传感器上的指纹 读取到 暂存区(数字量)

PS_Genchar暂存区指纹的图像数据 转换成 指纹特征数据:

存在buffer2

发注册模板指令Godo_RegModel

把buffer1,buffer2里的指纹特征融合,融合后存在buffer1或buffer2

发存储模板指令Godo_StoreChar 参数:BufferID=2融合后存在buffer2的情况):

存储的指令:融合后的指纹特征 存到 flash库里

十六~二十一:

录入图像 PS_GetImage

生成特征 PS_GenChar

void PS_RegModel()特征文件合并

PS_StoreChar()模板文件存到 PageID 号 flash 数据库位置。

都是

给发送数据包格式,写函数

给接收数据包格式,调试,AS608返还的数据正确与否

十五,从传感器读入 现场指纹 搜索从 10—100 的指纹库区间

buffer1/2里面的指纹特征数据,在flash指纹库里搜索,

有匹配的会显示匹配的,还有匹配得分

十六,录入图像 PS_GetImage:

探测手指,探测到后录入指纹图像存于 ImageBuffer。返回确认

码表示:录入成功、无手指等。

包长度 = 包长度至校验和(指令、参数或数据)的总字节数,包含校验和,但不

包含包长度本身的字节数。

#include "debug.h"

#include "uart.h"

void as608_init()

{

   Uart7_Init();

}

/*从传感器上读入图像存于图像缓冲区*/

void PS_GetImage()

{

   u8 string[]=

{0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x01,0x00,0x05};

   uart7_send_string(string,12);

}

十七,验证指纹模块 返还的数据 正确不正确(与PS_GetImage的应答包对比

delay一下,把时间错开,不然速度太快,基本上同一时间写入串口一

串口助手哪里,会打印在同一行

调试过程:

PS_GetImage();把数据包(在串口一上打印出来)写入DR,发给指纹模块

Delay_Ms(1000);延时1s打印

usart1_send_string(uart7_rec_string,15);把指纹模块返还的数据打印在串口1上

查错方法:

先写出数据 从发到收 的流程

void PS_GetImage()

{

   u8 string[]=

{0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x01,0x00,0x05};

   uart7_send_string(string,12);字符写入DR

}

/*串口7中断*/

void UART7_IRQHandler(void)

{

    u8 temp=0;

    if(USART_GetITStatus(UART7, USART_IT_RXNE) != RESET)

       {

在这里显示一个数字:看能不能进中断

进不了:指纹模块没返还数据,但是:接线正常,数据发送正常

错误原因:波特率

        ps_wait_flag=0;

        if(uart7_rec_tick>10)uart7_rec_index=0;

        temp=USART_ReceiveData(UART7);

        uart7_rec_string[uart7_rec_index]=temp;

        uart7_rec_index++;

        uart7_rec_tick=0;

       }

    USART_ClearITPendingBit(UART7, USART_IT_RXNE);

}

十八,生成特征 PS_GenChar

将 ImageBuffer 中的原始图像生成指纹特

征文件存于 CharBuffer1 或 CharBuffer2

包长度 = 包长度至校验和(指令、参数或数据)的总字节数,包含校验和,但不

包含包长度本身的字节数。

void PS_GenChar(u8 buffer)

{

u8 string[]=

{0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x04,0x02,buffer,0x00,0x01+0x00+0x04+0x02+buffer};

    uart7_send_string(string,13);

}

十九,验证指纹模块 返还的数据 正确不正确(与生成特征 PS_GenChar的应答包对比

调试过程:

获取指纹,生成特征存在buffer1

PS_GetImage();把数据包(在串口一上打印出来)写入DR,发给指纹模块

Delay_Ms(1000);延时1s打印

usart1_send_string(uart7_rec_string,15);把指纹模块返还的数据打印在串口1上

Delay_Ms(1000);

PS_GenChar(1);缓存区1

Delay_Ms(1000);

usart1_send_string(uart7_rec_string,15);

Delay_Ms(1000);

二十,void PS_RegModel()将 CharBuffer1 与 CharBuffer2 中的特征文件合并生成

模板,结果存于 CharBuffer1 与 CharBuffer2

void PS_RegModel()

{

u8 string[]=

{0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x05,0x00,0x09};

    uart7_send_string(string,12);

}

调试过程:

获取指纹,生成特征存在buffer1

...

获取指纹,生成特征存在buffer2

...

Godo_RegModel();

Delay_Ms(1000);

usart1_send_string(uart7_rec_string,15);

Delay_Ms(1000);

串口助手显示:

第一次PS_GetImage();

返回值

存在buffer1里面

返回值

第二次PS_GetImage();

返回值

存在buffer2里面

返回值

void PS_RegModel

返回值

二十一,PS_StoreChar(): 将 CharBuffer1 或 CharBuffer2 中的模板文件存到 PageID 号 flash 数据库位置。

void PS_StoreChar(u8 addr)

{

0x00,addr位置号:只用低八位

0x00,0x01+0x00+0x06+0x06+0x02+0x00+addr校验和,加起来一般<0xff,只用低八位

u8 string[]=

{0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x06,0x06,0x02,0x00,addr,0x00,0x01+0x00+0x06+0x06+0x02+0x00+addr};

    uart7_send_string(string,15);

}

调试过程:

获取指纹,生成特征存在buffer1

...

获取指纹,生成特征存在buffer2

...

将 CharBuffer1 与 CharBuffer2 中的特征文件合并生成 模板,结

果存于 CharBuffer1 与 CharBuffer2

...

PS_StoreCha(12);

Delay_Ms(1000);

usart1_send_string(uart7_rec_string,15);

Delay_Ms(1000);

二十二,搜索指纹 PS_Search: 以 CharBuffer1 或 CharBuffer2 中的特征文件搜索整个

或部分指纹库。若搜索到,则返回页码。

void PS_Search()

{

缓存区号直接不当参数,直接默认buffer2,0x02

起始页(startpage) :直接从0x00,0x00开始搜

页数(Pagenum)(结束页码) :搜到0x00,0xff 一共256

校验和 :0x01,0x00,0x08,0x04,0x02,0x00,0x00,0x00,0xff,0x01相加=0x10e

u8 string[]=

{0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x08,0x04,0x02, 0x00,0x00, 0x00,0xff, 0x01,0x0e};

     uart7_send_string(string,17);

}

二十三,WAK:随便接个GPIO(接PA1)

怎么检查模块上有无指纹:

按下时,才触发一下,手指触摸到指纹模块,引脚就是高电平,上面没手指,就是低电平

/*初始化*/

void As608_Gpio_Init()

{

    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;浮空输入

    GPIO_Init(GPIOA, &GPIO_InitStructure);

}

二十四,开始整体写代码

u8 mode;

//模式,0主页,1修改密码没有解锁管理员权限,2修改密码模式解锁了管理员权限

//3录入卡片,没有解锁管理员权限  4录入卡片,解锁了管理员权限

//5录入指纹,没有解锁管理员权限  6录入指纹,解锁了管理员权限

u8 as608_store_index=1

as608_proc()放调度器里,没20ms执行一次

void as608_proc()

{

手指放上去,只执行一次,不然会多次检查(按下触发)

变化了,在进来

//按下,抬起 都会进入

  as608_proc_falg=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);

  if(as608_proc_falg==as608_proc_falg_old)return;

  as608_proc_falg_old=as608_proc_falg;

//按下进入

  if(as608_proc_falg==0)return;

  if(mode==6)添加指纹的模式

  {

    PS_GetImage();//从指纹传感器获取图像到暂存区

    Ps_Wait();//等待接收到数据包

    PS_GenChar(1);生成特征

    Ps_Wait();//等待接收到数据包

    PS_GetImage();//从指纹传感器获取图像到暂存区

    Ps_Wait();//等待接收到数据包

    PS_GenChar(2);生成特征

Ps_Wait();//等待接收到数据包

    PS_RegModel();合并特征

    Ps_Wait();//等待接收到数据包

    PS_StoreChar(as608_store_index);保存进flash指纹库,位置号0~255

as608_store_index++;第一次指纹存在1,第二次指纹存在2,

as608_store_index初始值1

Ps_Wait();//等待接收到数据包

    audio_play(21);

    mode=0;

  }

  if(mode==0)

  {

      PS_GetImage();//从指纹传感器获取图像到暂存区

      Ps_Wait();//等待接收到数据包

      PS_GenChar(2);生成特征

      Ps_Wait();//等待接收到数据包

      PS_Search();搜索

      Ps_Wait();//等待接收到数据包

uart7_rec_string[13]搜索后,AS608返还得分

      if(uart7_rec_string[13]>50)//匹配

      {

          audio_play(16);

          lock_flag=0;//开门

          show_flag=1;//显示汉字们已开启

      }

      else

      {

          audio_play(17);

      }

  }

}

感觉可以优化一下Ps_Wait() 直接延时到 收到完整数据包后,

//中断七收到AS608返还的第一个字符,就跳出Ps_Wait()

//万一刚进入Ps_Wait()就收到字符,那岂不是 没有延时的话,瞬间跳出来

//所以最少执行一次Ps_Wait()延时200ms(延时低的话:会降低指纹解锁成功率)

void Ps_Wait()

{

  ps_wait_flag=1;

  do

  {

   Delay_Ms(200);

  }

   while(ps_wait_flag);

}

/*串口7中断*/

void UART7_IRQHandler(void)

{

    u8 temp=0;

    if(USART_GetITStatus(UART7, USART_IT_RXNE) != RESET)

       {

        ps_wait_flag=0;

        if(uart7_rec_tick>10)uart7_rec_index=0;

        temp=USART_ReceiveData(UART7);

        uart7_rec_string[uart7_rec_index]=temp;

        uart7_rec_index++;

        uart7_rec_tick=0;//1ms的计时变量

       }

    USART_ClearITPendingBit(UART7, USART_IT_RXNE);

}

二十五,清空指纹库 PS_Empty

: 删除 flash 数据库中所有指纹模板

void PS_Empty()

{

u8 string[]=

{0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x0d,0x00,0x11};

uart7_send_string(string,12);

}

相关文章:

学习笔记-沁恒第五讲-米醋

一&#xff0c;设置音量 上次 这次 #include "uart.h" #include "debug.h" 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(i0;i<7;i) { USART_Se…...

【JavaScript】JavaScript 常见概念 - 变量与数据类型 - 运算符 - 条件语句 - 循环 - 函数 - 数组操作 - 对象

1. 变量与数据类型 变量声明 JavaScript 提供了三种方式来声明变量&#xff1a; var&#xff08;全局或函数作用域&#xff0c;不推荐&#xff09;let&#xff08;块级作用域&#xff0c;推荐&#xff09;const&#xff08;常量&#xff0c;块级作用域&#xff0c;推荐&…...

Web自动化之Selenium添加网站Cookies实现免登录

在使用Selenium进行Web自动化时&#xff0c;添加网站Cookies是实现免登录的一种高效方法。通过模拟浏览器行为&#xff0c;我们可以将已登录状态的Cookies存储起来&#xff0c;并在下次自动化测试或爬虫任务中直接加载这些Cookies&#xff0c;从而跳过登录步骤。 Cookies简介 …...

AI手机的技术细节

前序&#xff1a;先说各个功能涉及到的技术&#xff0c;再说宏观系统架构。AI手机有这样几个做法&#xff0c;给手机侧边增加一个按键&#xff1b;把手机的语音助手做的很好&#xff0c;能够快速稳定的进行唤醒&#xff1b;通过特殊形式的触摸手机的曲面屏位置等来进行唤醒AI …...

10. 九转金丹炼矩阵 - 矩阵置零(标记优化)

哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的金丹谷,谷中有一座巨大的九转金丹炉,炉身闪烁着神秘的光芒。金丹炉的入口处有一块巨大的石碑,上面刻着一行文字:“欲破此炉,需以九转金丹之力,炼矩阵之零,标记优化定乾坤。” 哪吒定睛一看,石碑上还有…...

[实现Rpc] 客户端 | Requestor | RpcCaller的设计实现

目录 Requestor类的实现 框架 完善 onResponse处理回复 完整代码 RpcCaller类的实现 1. 同步调用 call 2. 异步调用 call 3. 回调调用 call Requestor类的实现 &#xff08;1&#xff09;主要功能&#xff1a; 客户端发送请求的功能&#xff0c;进行请求描述对服务器…...

Java 大视界 -- 深度洞察 Java 大数据安全多方计算的前沿趋势与应用革新(52)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

山东大学软件学院nosql实验三

实验题目&#xff1a; 用Java做简单查询(2学时) 实验内容 用API方式&#xff0c;做简单查询。 实验要求 在以下要求中选择至少2个&#xff0c;使用Java语言实现数据查询&#xff0c;最终把数据输出到前端界面。 &#xff08;1&#xff09;找出年龄小于20岁的所有学生 &…...

正态分布的奇妙性质:为什么奇数阶中心矩(odd central moments)为零?

正态分布的奇妙性质&#xff1a;为什么奇数阶矩为零&#xff1f; 正态分布&#xff08;Normal Distribution&#xff09;是统计学中最常见的分布之一&#xff0c;它的钟形曲线几乎无处不在&#xff0c;从身高体重到测量误差&#xff0c;都能看到它的影子。除了均值和方差这两个…...

【入门音视频】音视频基础知识

&#x1f308;前言&#x1f308; 这个系列在我学习过程中&#xff0c;对音视频知识归纳总结的笔记。因为音视频相关讲解非常稀少&#xff0c;所以我希望通过这个音视频系列&#xff0c;跟大家一起学习音视频&#xff0c;希望减少初学者在学习上的压力。同时希望也欢迎指出文章的…...

游戏引擎学习第120天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上次回顾&#xff1a;周期计数代码 我们正在进行一个项目的代码优化工作&#xff0c;目标是提高性能。当前正在优化某个特定的代码片段&#xff0c;已经将其执行周期减少到48个周期。为了实现这一目标&#xff0c;我们设计了一个…...

【Qt之QQuickWidget】QML嵌入QWidget中

由于我项目开始使用Widgets,换公司后直接使用QML开发&#xff0c;没有了解过如何实现widget到qml过渡&#xff0c;恰逢面试时遇到一家公司希望从widget迁移到qml开发&#xff0c;询问相关实现&#xff0c;一时语塞&#xff0c;很尴尬&#xff0c;粗略研究并总结下。 对qwidget嵌…...

Vue 3 + Vite 项目中配置代理解决开发环境中跨域请求问题

在 Vue 3 Vite 项目中&#xff0c;配置代理是解决开发环境中跨域请求问题的常见方法。通过在 Vite 的配置文件中设置代理&#xff0c;可以将前端请求转发到后端服务器&#xff0c;从而避免浏览器的同源策略限制。 1. 创建 Vue 3 Vite 项目 首先&#xff0c;确保你已经安装了…...

Eureka、ZooKeeper 和 Nacos 之间的对比

Eureka、ZooKeeper 和 Nacos 都是分布式系统中常用的服务注册与发现工具&#xff0c;但它们的定位、功能和适用场景有所不同。作为一名开发者&#xff0c;理解它们之间的对比有助于选择合适的技术栈。以下从多个维度进行详细比较&#xff1a; 1. 基本概述 Eureka 来源&#xff…...

CSS中padding和margin属性的使用

在 HTML 中&#xff0c;padding 和 margin 是用于控制元素布局和间距的重要属性。 一、Padding&#xff08;内边距&#xff09; 定义&#xff1a;Padding 是指元素内容与元素边框之间的距离。它可以在元素内部创造出空白区域&#xff0c;使得内容不会紧贴着边框。 作用 增加元…...

【Python爬虫(49)】分布式爬虫:在新兴技术浪潮下的蜕变与展望

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

网络安全-系统层攻击流程及防御措施

系统层攻击流程涉及多个阶段&#xff0c;攻击者通过逐步渗透以获取控制权或窃取数据。以下是详细的流程及防御措施&#xff1a; 1. 侦察&#xff08;Reconnaissance&#xff09; 信息收集&#xff1a; 主动扫描&#xff1a;使用工具如Nmap、Masscan扫描目标IP、开放端口、服务…...

centos 7 安装python3 及pycharm远程连接方法

安装openssl 使用pip3安装 virtualenv的时候会提示WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. 这是因为缺少openssl 2.0以上版本 解决办法&#xff1a; 一、先确认版本 openssl version 二、安…...

【llm对话系统】如何快速开发一个支持openai接口的llm server呢

核心思路&#xff1a;使用轻量级 Web 框架&#xff0c;将 OpenAI API 请求转换为你现有推理脚本的输入格式&#xff0c;并将推理脚本的输出转换为 OpenAI API 的响应格式。 快速开发步骤列表&#xff1a; 选择合适的 Web 框架 (快速 & 简单): FastAPI: Python 最佳选择&am…...

跟着柳叶刀数字健康,学习如何通过病理切片预测分子分类对预后的影响|项目复现

小罗碎碎念 项目复现 今天和大家分享一个非常具有参考价值的项目,手把手带着大家复现一篇发表在柳叶刀数字健康的文章。 花了六个小时才完成的这篇推送,信息量非常大,遇到了很多报错问题,但是解决以后的感觉是非常爽的,先给大家展示一下最终的成果——在同一张切片上,通…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...