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

嵌入式蓝桥杯做题总结

第十二届省赛

按键代码

——自认为比较巧妙,定时器3被设置为10ms进入一次中断,代替了HAL_Delay(10)的方法消抖;

运用状态机机思想实现检测多个按键检测——且分为两个状态,其中一个状态PB1和PB2的按键不可使用

struct Key key[4] = {0, 0, 0};
uint8_t f;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if (htim->Instance == TIM3){key[0].Key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);key[2].Key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);key[3].Key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);key[1].Key_sta = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);}//注意B2和B3对应Key[2]和Key[3];而B4对应Key[1];// Note that B2 and B3 correspond to Key[2] and Key[3]; B4 corresponds to Key[1];if (Para_flag==0) f=2;else f=4;//让按键B2~B3不可以在界面一中使用//注意上面的赋值// Make keys B2 to B3 unavailable in interface 1// Note the above assignmentfor (int i=0; i<f; i++){switch (key[i].sta){case 0:if (key[i].Key_sta==0){key[i].sta=1;}break;case 1:if (key[i].Key_sta==0){key[i].sta=2;}else{key[i].sta=0;}break;case 2:if(key[i].Key_sta==1) {key[i].sta=0;if(key[i].time<100){key[i].flag=1;key[i].time=0;}}else{key[i].time++;if (key[i].time>=100){key[i].long_flag=1;key[i].time=0;}}break;}}
}
//注意Time是用于检测长按按键的,本体用不上

菜单函数

在菜单中实现了按键二次检测 伏笔回收

#include "menu.h"
uint8_t data1=2, data2=4, data3=2;
double data4=3.5, data5=2;
char text1[30] = " ", text2[30] = " ",text3[30] = " ", text4[30] = " ";
char flag_m=0,Para_flag=0,PWM_Flag=1;void Menu(void)
{if (key[0].flag==1){flag_m=!flag_m;LCD_Clear(Black);//每次展示菜单前先清屏key[0].flag=0;}if (key[1].flag==1){PWM_Flag=!PWM_Flag;key[1].long_flag=0;key[1].flag=0;}//PWM和低电平的设置if (PWM_Flag==0)  __HAL_TIM_SetCompare(&htim15, TIM_CHANNEL_1, 20);else              __HAL_TIM_SetCompare(&htim15, TIM_CHANNEL_1, 0);if (flag_m==0){Para_flag = 0;show_Data();}else{Para_flag = 1;show_Para();}
}
void show_Data(void)
{data3=8-data1-data2;sprintf(text1, "       Data         ");sprintf(text2, "   CNBR:%d          ",data1);sprintf(text3, "   VNBR:%d          ",data2);sprintf(text4, "   IDLE:%d          ",data3);LCD_DisplayStringLine(Line2, (unsigned char *)text1);LCD_DisplayStringLine(Line4, (unsigned char *)text2);LCD_DisplayStringLine(Line6, (unsigned char *)text3);LCD_DisplayStringLine(Line8, (unsigned char *)text4);  
}void show_Para(void)
{sprintf(text1, "       Para         ");sprintf(text2, "   CNBR:%.2f          ",data4);sprintf(text3, "   VNBR:%.2f          ",data5);LCD_DisplayStringLine(Line2, (unsigned char *)text1);LCD_DisplayStringLine(Line4, (unsigned char *)text2);LCD_DisplayStringLine(Line6, (unsigned char *)text3);if (key[2].flag==1){data4+=0.5;data5+=0.5;key[2].long_flag=0;key[2].flag=0;}if (key[3].flag==1){data4-=0.5;data5-=0.5;key[3].long_flag=0;key[3].flag=0;}
}

我认为最难的就是串口部分

也可能是我的方法过于难了,应该可以使用先把串口数据存到数组,然后在数组中依靠下标来检测错误

遇到的难题--就是串口接收时检测到数据不符合格式,虽然重新开始存入数据,但是数据缓存区的数据没有被清空,会被带到下一次数据中,因此在寻找清空缓存区的方法过程中浪费很多时间,所幸也找到了对应的方法--暂时关闭中断接收,再在while循环中打开

//printf函数重写
int fputc(int c, FILE *stream)
{uint8_t ch[1]={c};HAL_UART_Transmit(&huart1, (unsigned char *)ch, 1, 0xFFFF);return c;
}uint8_t rx=0;
uint8_t Index=0;
char temp_t[5];
char temp_n[5];
char temp_time[11];
char temp_minute[3];
char trash;
uint8_t usart_state=0;//用于标志是否接收完数据 是否可以进入处理函数//方法1 在串口处初步处理信息——出现bug是无法清除串口缓存区导致的
//串口接收中断函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if (huart->Instance == USART1){if (Index<4){HAL_UART_Receive_IT(&huart1, &rx, 1);temp_t[Index++]=rx;}else if(Index==4){HAL_UART_Receive_IT(&huart1, &rx, 1);if (rx!=':'){//目的:出现错误时会打印出两个Error,尝试在出现错误后读取数据并清空数据来解决问题//方法一:失败——找不到对应的寄存器//把剩下的数据读出即可//实现方法while(sr&rx_flag)xxx=dr
//        while(USART1->ISR&0x10)
//        {
//          HAL_UART_Receive_IT(&huart1, &rx, 1);
//          trash=rx;
//        }//方法二:这个函数似乎不起作用
//        __HAL_UART_FLUSH_DRREGISTER(&huart1);
//        //方法三:似乎也不起作用
//        while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)==SET)
//        {
//          HAL_UART_Receive_IT(&huart1, &rx, 1);
//        }
//        __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);//方法三:直接在这关闭串口中断接收,然后在while循环中再打开 效果出奇地好//可能关闭中断接收后,对应的缓存区的数据也被清除了HAL_UART_AbortReceive_IT(&huart1);Index=0;printf("Erorr\r\n");}else{Index++;}}else if (Index<9){HAL_UART_Receive_IT(&huart1, &rx, 1);temp_n[(Index++)-5]=rx;}else if (Index==9){HAL_UART_Receive_IT(&huart1, &rx, 1);if (rx!=':'){
//        while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)==SET)
//        {
//          HAL_UART_Receive_IT(&huart1, &rx, 1);
//        }
//        __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);HAL_UART_AbortReceive_IT(&huart1);Index=0;printf("Erorr\r\n");}else{Index++;}}else if (Index>9)//前大段数字{if(Index<20){HAL_UART_Receive_IT(&huart1, &rx, 1);temp_time[(Index++)-10]=rx;}else//只有分{HAL_UART_Receive_IT(&huart1, &rx, 1);temp_minute[(Index++)-20] = rx;}}if (Index==22){usart_state=1; Index=0;//表示一组数据接收完成 置标志位 可以进入数据处理函数}
//    if (Index==22)
//    {
//      for (int i=0;i<4;i++) printf("%c", temp_t[i]);
//      printf(":");
//      for (int i=0;i<4;i++) printf("%c", temp_n[i]);
//      printf(":");
//      for (int i=0;i<12;i++) printf("%c", temp_time[i]);
//    }}
}
#include "Myusart.h"struct In in[8]={0};
uint8_t yn=0;//是否在车库内
uint8_t outcar_index=0;
double Money=0;
uint16_t Time_parking=0;
struct Time temp_time_struct;void USART_Deal(void)
{if (usart_state==1){//置零以便下次工作usart_state=0;//先把字符串数组的最后一位置为'\0'——必要操作temp_n[4]='\0';temp_t[4]='\0';temp_time[10]='\0';temp_minute[2]='\0';//对时间进行处理//注意strtol最大只能转int32_t的数 uint64_t number=strtol(temp_time, NULL, 10);//字符串数字转int类型uint8_t number1=strtol(temp_minute, NULL, 10);temp_time_struct.Y=number/1000000;//yeartemp_time_struct.M=number/10000%100;//monthtemp_time_struct.D=number/100%100;//daytemp_time_struct.h=number%100;//hourtemp_time_struct.m=number1;//min//Error情况if ((temp_time_struct.M>12)&& (temp_time_struct.D>31)&& (temp_time_struct.h>23)&& (temp_time_struct.m>59)){printf("Erorr\r\n");return ;}//遍历结构体数组寻找number1;//min是否已经停在车库for(int i=0; i<8; i++){if (in[i].YN==1){if (!strcmp(temp_n, in[i].num)){outcar_index=i;yn=1;//出停车库//并把对应车辆所有清零}else {yn=0;}}else {yn=0;}}//是否在车库内之后的操作if (yn==1){//出停车库//并把对应车辆所有清零in[outcar_index].YN=0;Time_parking = (temp_time_struct.Y-in[outcar_index].t.Y)*8760+(temp_time_struct.M-in[outcar_index].t.M)*720+(temp_time_struct.D-in[outcar_index].t.D)*24+(temp_time_struct.h-in[outcar_index].t.h)+(bool)(temp_time_struct.m-in[outcar_index].t.m);if(!(strcmp(temp_t, "CNBR\0"))){Money=Time_parking*data4;data1--;}if ((!strcmp(temp_t, "VNBR\0"))){Money=Time_parking*data5;data2--;}printf("%s:%s:%d:%.2f\r\n", temp_t, temp_n, Time_parking, Money);printf("%d\r\n", in[outcar_index].YN);}else//进入停车库 记录信息{//判断车位是否已满 如果已满则取消操作data3=8-data1-data2;if ((data3-1)<0){printf("Erorr\r\n");return ;}else{if(!(strcmp(temp_t, "CNBR\0"))){data1++;}if ((!strcmp(temp_t, "VNBR\0"))){data2++;}}//寻找结构体数组中的空位uint8_t temp_index=0;for(int i=0; i<8; i++){if (in[i].YN==0){temp_index=i;}}//赋值strcpy(in[temp_index].type, temp_t);strcpy(in[temp_index].num, temp_n);//注意strtol最大只能转int32_t的数 uint64_t number=strtol(temp_time, NULL, 10);//字符串数字转int类型uint8_t number1=strtol(temp_minute, NULL, 10);in[temp_index].t.Y=number/1000000;//yearin[temp_index].t.M=number/10000%100;//monthin[temp_index].t.D=number/100%100;//dayin[temp_index].t.h=number%100;//hourin[temp_index].t.m=number1;//minin[temp_index].YN=1;printf("%s-",in[temp_index].type);printf("%s-",in[temp_index].num);printf("%d-%d-%d-%d-%d\r\n",in[temp_index].t.Y,in[temp_index].t.M,in[temp_index].t.D,in[temp_index].t.h,in[temp_index].t.m);}}}

串口代码的优化

这次采取的方法是先把数据存到数组中,再根据下标判断数据是否符合规范

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if (huart->Instance == USART1){HAL_UART_Receive_IT(&huart1, &rx, 1);data[data_index++] = rx;if (data_index>=22){//关闭串口接收中断——清空缓存区,以免有多余信息HAL_UART_AbortReceive_IT(&huart1);data_index=0;usart_state=1;
//      printf("%s", data);}}
}
void Usart_Deal_Better(void)
{if (usart_state==1){//置零以便下次工作usart_state=0;if (!(data[3]==':')&&!(data[9]==':'))//判断':'格式{printf("Error");return ;}//判断数字是否正确strncpy(temp_time, data+10, 10);strncpy(temp_minute, data+20, 2);temp_time[10]='\0';temp_minute[2]='\0';uint64_t number=strtol(temp_time, NULL, 10);//字符串数字转int类型uint8_t number1=strtol(temp_minute, NULL, 10);temp_time_struct.Y=number/1000000;//yeartemp_time_struct.M=number/10000%100;//monthtemp_time_struct.D=number/100%100;//daytemp_time_struct.h=number%100;//hourtemp_time_struct.m=number1;//minif ((temp_time_struct.Y>2099)||(temp_time_struct.Y<2000)||(temp_time_struct.M>12)||(temp_time_struct.D>31)||(temp_time_struct.h>23)||(temp_time_struct.m>59)){printf("Error\r\n");return ;}//判断是否在停车场中//复制编号出来strncpy(temp_n, data+5, 4); for (int i=0; i<8; i++){if (in[i].YN==1){if (!strcmp(temp_n, in[i].num))//如果在停车场中{if (strncmp(data, in[i].type, 4)){printf("Error\r\n");return ;}else {outcar_index=i;yn=1;break;}}else//不在停车场中{yn=0;}}else yn=0;}uint8_t temp_index=0;//用于寻找结构体数组内的空位if (yn==0)//新来的{if (strncmp(data,"CNBR", 4)&&strncmp(data,"VNBR", 4))//判断停车类型{printf("Error\r\n");return ;}else//类型输入正确{data3=8-data1-data2;if ((data3-1)<=0){printf("Error\r\n");return ;}else//停车位充足{if (!strncmp(data,"CNBR", 4)){data1++;}if (!strncmp(data,"VNBR", 4)){data2++;}for (int i=0; i<8; i++)//寻找结构体数组中的空位{if (in[i].YN==0){temp_index=i;break;}}//登记信息strncpy(in[temp_index].type, data, 4);strncpy(in[temp_index].num, data+5, 4);strncpy(temp_time, data+10, 10);strncpy(temp_minute, data+20, 2);temp_time[10]='\0';temp_minute[2]='\0';uint64_t number=strtol(temp_time, NULL, 10);//字符串数字转int类型uint8_t number1=strtol(temp_minute, NULL, 10);in[temp_index].t.Y=temp_time_struct.Y;in[temp_index].t.M=temp_time_struct.M;in[temp_index].t.D=temp_time_struct.D;in[temp_index].t.h=temp_time_struct.h;in[temp_index].t.m=temp_time_struct.m;in[temp_index].YN=1;printf("%s-",in[temp_index].type);printf("%s-",in[temp_index].num);printf("%d-%d-%d-%d-%d\r\n",in[temp_index].t.Y,in[temp_index].t.M,in[temp_index].t.D,in[temp_index].t.h,in[temp_index].t.m);}}}else//出停车库 {in[outcar_index].YN=0;strncpy(temp_t, data, 4);Time_parking = (temp_time_struct.Y-in[outcar_index].t.Y)*8760+(temp_time_struct.M-in[outcar_index].t.M)*720+(temp_time_struct.D-in[outcar_index].t.D)*24+(temp_time_struct.h-in[outcar_index].t.h);if ((temp_time_struct.m-in[outcar_index].t.m>0)){Time_parking++;}  if(!(strcmp(temp_t, "CNBR\0"))){Money=Time_parking*data4;data1--;}if ((!strcmp(temp_t, "VNBR\0"))){Money=Time_parking*data5;data2--;}printf("%s:%s:%d:%.2f\r\n", temp_t, temp_n, Time_parking, Money);}}
}

十三届省赛

IIC部分

IIC的读写eeprom和读读eeprom之间必须要有时间间隔,否则会出现写入错误或者读出错误

例如图中的Delay10ms

ADC采样部分

由于之前ADC采集两个电位器电压是用了不同的两个ADC,而这次题目要求是用同一个ADC的不同通道,这就涉及到了ADC多通道采集的问题了

首先cubemx配置,打开对应的输入引脚

再打开扫描模式,连续转换,DMA转运

 

 代码甚至只需要一句

自己创建一个数组存储数据

HAL_ADC_Start_DMA(&hadc2, (uint32_t *)ADC_value,2);

仔细看芯片手册,板子上的电压采集是J11和J12口,因为没看清楚,导致浪费了3个小时检查错误

且要注意一直打开DMA转运会严重拖慢程序的执行,即导致板子上程序运行极为缓慢,所以可以在交互后需要获取ADC的值时打开ADC_DMA转运,接收好数据后立马关闭,这样就不会太大地影响板子的运行速度了

if (B4==0)//Data{HAL_ADC_Start_DMA(&hadc2, (uint32_t *)ADC_value,2);HAL_Delay(10);data1=ADC_value[0]*3.3/4096;data2=ADC_value[1]*3.3/4096;recd1++;recd1_5++;recdPA4_buff[PA4_Index++]=data1;recdPA5_buff[PA5_Index++]=data2;if (recd2<data1)    {recd2=data1;}if (recd3>data1)    {recd3=data1;}if (recd2_5<data2)  {recd2_5=data2;}if (recd3_5>data2)  {recd3_5=data2;}HAL_ADC_Stop_DMA(&hadc2);//记得关闭DMA,否则会导致程序运行缓慢}

 

相关文章:

嵌入式蓝桥杯做题总结

第十二届省赛 按键代码 ——自认为比较巧妙&#xff0c;定时器3被设置为10ms进入一次中断&#xff0c;代替了HAL_Delay(10)的方法消抖&#xff1b; 运用状态机机思想实现检测多个按键检测——且分为两个状态&#xff0c;其中一个状态PB&#xff11;和PB&#xff12;的按键不…...

Spring Boot 常用注解大全

以下是Spring Boot中常用的注解及其详细解释以及相应的代码示例&#xff1a; SpringBootApplication: 这个注解用于标识一个Spring Boot应用的主类。它整合了 Configuration&#xff0c;EnableAutoConfiguration 和 ComponentScan。 SpringBootApplication public class Demo…...

(MATLAB)第十二章-数列与极限

目录 12.1 数列 12.1.1 数列求和 1. 累计求和函数sum() 2. 忽略NaN累计求和函数 nansum() 3. 求此元素位置之前的元素和函数cumsum() 4. 求梯形累计和函数cumtrapz() 12.1.2 数列求积 1. 元素连续相乘函数 prod() 2. 求累计积函数 cumprod() 3. 阶乘函数 ffactorial(n…...

OJ输入问题+准备

写在之前&#xff1a; 发现题目输入是这样的&#xff1a; 我的问题&#xff1a;如何通过空格分割这些输入的字符串并分别保存&#xff01;&#xff01;&#xff08;C语言scanf好解决一点但我选择C....&#xff09; C引入了ostringstream、istringstream、stringstream这三个类…...

软考高级:主动攻击和被动攻击概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…...

cuda python torch 虚拟环境配置

以下是Pytorch和CUDA对应的版本 以下是Pytorch和Python对应的版本 检查cuda与Python版本是否匹配 import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.empty(3,4,devicecuda))cuda 删除cuda conda uninstall cudatoolkit --forceconda u…...

激光炸弹 刷题笔记

前置知识 二维前缀和 子矩阵的和 刷题笔记 {二维前缀和}-CSDN博客 思路 参考二维前缀和 将子矩阵的和 做成动态矩阵 一个个矩阵搜索 符合要求边长 矩阵中的元素和最大值 将x1,y1用i-k,j-k表示即可 x2,y2用i&#xff0c;j表示 代码 #include<iostream> #include<…...

Vue3学习记录(三)--- 组合式API之生命周期和模板引用

一、生命周期 1、简介 ​ 生命周期&#xff0c;指的是一个 Vue 实例从创建到销毁的完整阶段&#xff0c;强调的是一个时间段。 ​ 生命周期钩子函数&#xff0c;指的是 Vue 实例提供的内置函数&#xff0c;函数的参数为一个回调函数。这些钩子函数会在实例生命周期的某些固定…...

Batch Normalization和Layer Normalization和Group normalization

文章目录 前言一、Group normalization二、批量规范化(Batch Normalization)三、层规范化&#xff08;Layer Normalization&#xff09; 前言 批量规范化和层规范化在神经网络中的每个批次或每个层上进行规范化&#xff0c;而GroupNorm将特征分成多个组&#xff0c;并在每个组内…...

命名实体识别NER(综合代码示例)

一、命名实体识别发展方向 二、中文数据集 CCKS2017开放的中文的电子病例测评相关的数据。 评测任务一&#xff1a;https://biendata.com/competition/CCKS2017_1/ 评测任务二&#xff1a;https://biendata.com/competition/CCKS2017_2/ CCKS2018开放的音乐领域的实体识别任务…...

关于jQuery日历插件:daterangepicker

关于options singleDatePicker: false 双日历&#xff0c;true 单日历 timePicker&#xff1a;false 不显示时分秒&#xff0c;true 显示时分秒 timePickerIncreament&#xff1a;1 默认值 {singleDatePicker : false, //是否显示单日历框 dateLimit : { days : 30 }, //起…...

【贪心算法】最大子序和

给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1a;6…...

爬虫逆向网站案例

一、相关网页 东方财富人气排行榜 二、查找url 三、寻找curl并复制 四、打开Convert curl commands to code (curlconverter.com) 五、修改并执行代码 import requestscookies {st_si: 73974981954644,st_pvi: 39724919122964,st_sp: 2024-03-05%2018%3A27%3A22,st_inirUrl:…...

蓝桥杯复习之前缀和

题目链接&#xff1a;https://www.luogu.com.cn/problem/P8649 思路&#xff1a; 看到区间和&#xff0c;第一反应肯定是前缀和&#xff0c;我们求出前缀和后对前缀和数组每一个值模k&#xff0c;然后对一个数组的值查看前面有几个相同的&#xff0c;举个例子&#xff1a;…...

动态规划(算法竞赛、蓝桥杯)--背包DP求具体方案

1、B站视频链接&#xff1a;E20 背包DP 求具体方案_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N1010; int v[N],w[N]; int f[N][N],p[N][N];int main(){int n,m;cin>>n>>m;for(int i1;i<n;i)cin>>v[i]>>w[i…...

go写mysql取得自增字段值

场景&#xff1a;有多张表&#xff0c;依据其中一张表的自增字段取得 id 值作为对象ID&#xff0c;然后使用这个Id插入到其他它表中。 如下一张 MySQL 的 innodb 表 X&#xff0c;用 go 编写程序&#xff0c;不指定 a 的值&#xff0c;指定 b 和 c 的值&#xff0c;往表 X 插入…...

Vue 3的Composition API和vue2的不同之处

Vue 3的Composition API是Vue.js框架的一个重要更新&#xff0c;它提供了一种新的组件逻辑组织和复用方式。在Vue 2中&#xff0c;我们通常使用Options API&#xff08;data、methods、computed等&#xff09;来组织组件的逻辑&#xff0c;但这种组织方式在处理复杂组件时可能会…...

go语言基础 -- 面向对象编程

go语言面向对象编程思想 面向对象编程离不开封装、继承、多态三个特性&#xff0c;go语言与其他c、java不太一样&#xff0c;没有类的概念&#xff0c;面向对象的实现也有些区别&#xff0c;下面分别描述。 go语言封装 结构体中字段如欲对外隐藏&#xff0c;首字母小写&…...

HarmonyOS—编译构建概述

编译构建是将应用/服务的源代码、资源、第三方库等&#xff0c;通过编译工具转换为可直接在硬件设备上运行的二进制机器码&#xff0c;然后再将二进制机器码封装为HAP/APP软件包&#xff0c;并为HAP/APP包进行签名的过程。其中&#xff0c;HAP是可以直接运行在模拟器或真机设备…...

下载element-ui 资源,图标 element-icons.woff,element-icons.ttf 无法解码文件字体

css下载地址&#xff1a;https://unpkg.com/element-ui2.15.14/lib/theme-chalk/index.css js下载地址&#xff1a;https://unpkg.com/element-ui2.15.14/lib/index.js 图标及文字文件下载地址&#xff1a; element-icons.woff:&#xff1a; ​ https://unpkg.com/element-…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...