基于RT-Thread的STM32G4开发第二讲第二篇——ADC
文章目录
- 前言
- 一、RT-Thread工程创建
- 二、ADC工程创建
- 三、ADC功能实现
- 1.ADC.c
- 2.ADC.h
- 3.mian.c
- 四、效果展示和工程分享
- 总结
前言
本文使用的是RT-Thread最新的驱动5.1.0,兼容下面的所有驱动。使用的开发板是蓝桥杯嵌入式国信长安的开发板,MCU是STM32G431RBT6。
我已经写了基于STM32F4关于ADC的文章(见上一篇),为什么还要写基于STM32G4的呢。原因是RT-Thread对STM32G4的ADC外设的适配极其不好,初始化缺失还不报错,为了实现这个功能,花费了我很多时间,我觉得有必要分享出来。
本章同上一章有很多内容相似,我都重新说一遍,这样大家按选择看一篇文章就行
一、RT-Thread工程创建
先在RT-Thread studio中创建好工程,参考下面的文章使得驱动5.1.0全构建不报错和警告,如图所示。
RT-Thread studio的驱动5.1.0报错修改
下面工程名改为IO_ADC
不要着急修改时钟配置,这里按我方法来,打开自动生成的CubeMX Settings(找不到的话点击窗口,恢复窗口布局,在项目资源管理器下。在CubeMX中按裸机编程一样,把时钟和需要用到的外设都配置好。配置详情我就不说了,看前面的文章就行。
注意使用到的外设都要配置,开局使用串口1作为控制台串口,所以这里也要配置。示例如下
这里我使用了ADC1和ADC2,配置如下,对于ADC的详细参数,也要配置一下,可以作为后面RT-Thread的参考,关于ADC的详情配置见下文。
STM32LL库编程系列第八讲——ADC模数转换
这里的IDE要选择EWARM,也就是保持默认,很重要,其他照常
到这一步就可以生成工程了
第一次生成工程后要把cubeMX关闭掉,这样RT-Thread studio才会同步(下面每一步的图片参考上一篇文章)
点击左边文件,cubemx(没有的话,刷新一下),右键Src,资源配置,排除构建
打开cubemx的mian.c复制函数void SystemClock_Config(void)
,包括函数名全部复制,在打开drivers/drv_clk.c,把void system_clock_config(int target_freq_mhz)
函数删了,把复制的void SystemClock_Config(void)
粘贴原地,接着全编译,没有问题。
到这一步你可以把工程保存好,在RT-Thread studio中基于STM32G431系类的驱动5.1.0的初始工程创建完成,以后再用就直接复制工程就行,不用重复创建了。这一点也希望官方优化,不需要我们这么麻烦。
二、ADC工程创建
打开cubemx/src/adc.h。复制函数void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
和void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
到drivers/board.c的末尾,把全局变量HAL_RCC_ADC12_CLK_ENABLED删除,并删除该全局变量的if判断,也就是这样。
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};if(adcHandle->Instance==ADC1){/** Initializes the peripherals clocks*/PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}/* ADC1 clock enable */__HAL_RCC_ADC12_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/**ADC1 GPIO ConfigurationPB12 ------> ADC1_IN11*/GPIO_InitStruct.Pin = GPIO_PIN_12;GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);}else if(adcHandle->Instance==ADC2){/** Initializes the peripherals clocks*/PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}/* ADC2 clock enable */__HAL_RCC_ADC12_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/**ADC2 GPIO ConfigurationPB15 ------> ADC2_IN15*/GPIO_InitStruct.Pin = GPIO_PIN_15;GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);}
}void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
{if(adcHandle->Instance==ADC1){__HAL_RCC_ADC12_CLK_DISABLE();/**ADC1 GPIO ConfigurationPB12 ------> ADC1_IN11*/HAL_GPIO_DeInit(GPIOB, GPIO_PIN_12);}else if(adcHandle->Instance==ADC2){__HAL_RCC_ADC12_CLK_DISABLE();/**ADC2 GPIO ConfigurationPB15 ------> ADC2_IN15*/HAL_GPIO_DeInit(GPIOB, GPIO_PIN_15);}
}
这两个函数不需要在board.h中去声明,有其他.h已经声明好了,所以这里复制过来就可以用。
打开board.h需要的ADC的宏,不需要再去stm32f4xx_hal_config.h中注释宏#define HAL_ADC_MODULE_ENABLED了,细心的同学可以发现了,drivers中更名为了stm32f4xx_hal_config_bak.h。而stm32f4xx_hal_config.h在cubemx/inc中了,已经在创建时开启宏HAL_ADC_MODULE_ENABLED了。
接着在RT-Thread Settings中打开ADC驱动
注意开启ulog日志,进入到里面开启使能浮点数支持,这将会使我们rt_kprintf能够输出浮点数。
(上面两步参考图片见上一篇)
全编译,会发现有如下报错
原因是没有声明函数__HAL_ADC_ENABLE0
,这并不是头文件没有添加而是根本没有这个函数,经过我和前面工程的对比,发现所有使能ADC的函数换成了ADC_Enable
,但是这里使用ADC_Enable
的#if判断没有我们的型号,那就需要自己添加,如下(这也是bug,希望官方看到能修复)
还剩下两个报错原因是参数类型不一致,这和修改5.1.0报错一样
修改结构体和函数都行,他们保持一致就好,我的修改如下,我修改的是函数形参。
struct rt_adc_ops
{rt_err_t (*enabled)(struct rt_adc_device *device, rt_int8_t channel, rt_bool_t enabled);rt_err_t (*convert)(struct rt_adc_device *device, rt_int8_t channel, rt_uint32_t *value);rt_uint8_t (*get_resolution)(struct rt_adc_device *device);rt_int16_t (*get_vref) (struct rt_adc_device *device);
};static rt_err_t stm32_get_adc_value(struct rt_adc_device *device, rt_int8_t channel, rt_uint32_t *value)
static rt_err_t stm32_adc_enabled(struct rt_adc_device *device, rt_int8_t channel, rt_bool_t enabled)
到此全编译程序没有错误,到这里ADC工程创建完成了
三、ADC功能实现
这里我要讲点网上没有的(起码此刻孤陋寡闻的我没找到)
点击drivers/include/confing/adc_confing.h这里有我们使用的ADC的初始化参数,rtthread studio并没有ADC参数控制函数,想要修改,只能在这改,希望官方更新一下,可以像uart外设这样,建一个ADC参数结构体,里面包含了所有参数设计,再利用rt_device_control
函数写进去,这样才符合常理,不能老是去驱动文件里改啊,很难找的。
这里说笑了,对于国产软件生态,还需要我们大家共同努力完善。所以我愿意把我的发现免费分享出来。
打开cubemx/src/adc.c对照里面的参数设置,对adc_confing.h进行更改(这也是我前面说把参数配置完全,后面好参照)
我的设置如下,对比cubemx/src/adc.c这里有些参数设置不全,可以自行添加,也可以默认,这些缺失参数不重要,添加注意需要最后的 **,不然会报错。
打开drivers/drv_adc.c**找到函数stm32_get_adc_value
这里面有如下设置语句
ADC_ChanConf.Channel = stm32_adc_get_channel(channel);
ADC_ChanConf.Rank = 1;
对比cubemx/src/adc.c你会发现通道参数设置缺失严重,这也就是为什么程序不报错但功能实现不了的原因(再次呼吁官方完善)
我的修改如下
ADC_ChanConf.Channel = stm32_adc_get_channel(channel);//不变
#if defined(SOC_SERIES_STM32G4)ADC_ChanConf.Rank = ADC_REGULAR_RANK_1;
#elseADC_ChanConf.Rank = 1;
#endif
#elif defined(SOC_SERIES_STM32G4)ADC_ChanConf.SamplingTime = ADC_SAMPLETIME_24CYCLES_5;
#ifdef SOC_SERIES_STM32G4 ADC_ChanConf.OffsetNumber = ADC_OFFSET_NONE;ADC_ChanConf.SingleDiff = LL_ADC_SINGLE_ENDED;ADC_ChanConf.Offset = 0;
#endif
图片也附上
对于ADC_ChanConf.Rank
我们配置cubemx时选的是1,也就是只有一个通道,但是不同芯片下的赋值不一样,有的直接是1,有的是ADC_REGULAR_RANK_1宏,这个宏的值为6。开始我没注意这部分,导致程序不报错,各种初始化也成功,但就是采集值永远是0,折磨我很久,问题就在这。
官方的条件编译指令的判断缺失了很多,我使用的芯片就没有,这里我也用条件编译指令加上,这样不会影响其他程序。
设置完成就有HAL_ADC_ConfigChannel(stm32_adc_handler, &ADC_ChanConf);
到这ADC的初始化才结束。编译程序没有错误。
把board.c的#include <drv_common.h>粘贴到board.h(不然很多引用board.h的文件不含drv_common.h,导致报错)
APP文件夹里是我自定义的文件夹,其他函数不用管,本工程只用到ADC.c和ADC.h。注意创建文件夹要把头文件目录添加进构建啊。如何添加见本系列第一讲
1.ADC.c
这里面包含adc初始化和线程初始化,代码逻辑我就不讲了,我的代码风格应该挺正规的,具体编写流程去看官方文档或其他人文章
和上一章的内容比只改变了通道号,其余没有变化,这也是操作系统的良好移植性。
#include "ADC.h"#define ADC1_NAME "adc1"
#define ADC2_NAME "adc2"
#define REFER_VOLTAGE 3.3
#define CONVERT_BITS (1<<10)static void adc_thread_entry(void *parameter);
rt_adc_device_t adc1_handle,adc2_handle;
int adc_init(void)
{rt_err_t adc1_flag,adc2_flag;adc1_handle = (rt_adc_device_t)rt_device_find(ADC1_NAME);adc2_handle = (rt_adc_device_t)rt_device_find(ADC2_NAME);if((adc1_handle == RT_NULL) || (adc2_handle == RT_NULL)){rt_kprintf("failed to adc handle fine\n");return -1;}adc1_flag = rt_adc_enable(adc1_handle, 11);adc2_flag = rt_adc_enable(adc2_handle, 15);if((adc1_flag != RT_EOK) || (adc2_flag != RT_EOK)){rt_kprintf("failed to adc enable\n");return -1;}rt_kprintf("adc1 and adc2 init success\n");return 0;
}
int adc_thread_init(void)
{rt_thread_t adc_thread;adc_thread = rt_thread_create("adc_thread", adc_thread_entry, RT_NULL, 1024, 9, 100);if(adc_thread == RT_NULL){rt_kprintf("failed to adc thread create");return -1;}if(rt_thread_startup(adc_thread) != RT_EOK){rt_kprintf("failed to adc startup\n");return -1;}return 0;
}
static void adc_thread_entry(void *parameter)
{float adc1_V_old = 0,adc2_V_old = 0;float adc1_V_new,adc2_V_new;while(1){adc1_V_new = (float)rt_adc_read(adc1_handle, 11)*REFER_VOLTAGE/CONVERT_BITS;adc2_V_new = (float)rt_adc_read(adc2_handle, 15)*REFER_VOLTAGE/CONVERT_BITS;if( ((int)(adc1_V_old *100) != (int)(adc1_V_new *100)) || ((int)(adc2_V_old *100) != (int)(adc2_V_new *100)) ){rt_kprintf("get voltage for adc1 and adc2 is: %.2f and %.2f\n",adc1_V_new, adc2_V_new);adc1_V_old = adc1_V_new;adc2_V_old = adc2_V_new;}rt_thread_mdelay(100);}
}
2.ADC.h
#ifndef APP_ADC_H_
#define APP_ADC_H_#include <board.h>
#include <rtdevice.h>int adc_init(void);
int adc_thread_init(void);#endif /* APP_ADC_H_ */
3.mian.c
#include <rtthread.h>#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include "ADC.h"int main(void)
{adc_init();adc_thread_init();while (1){rt_thread_mdelay(1000);}return RT_EOK;
}
编译0错误0警告,到此工程结束。
四、效果展示和工程分享
这个时候效果和上一章一样,有点误差,这个时候我们加入校准函数
打开drivers/drv_adc.c在HAL_ADC_Start
前加入校准函数HAL_ADCEx_Calibration_Start(stm32_adc_handler,ADC_SINGLE_ENDED);
重新编译和下载
发现误差基本消除了(最高有3.29V,接近理论3.3V,前面最高只能到3.25V)
工程上传百度网盘,包括IO_ADC和初始工程文件,免费下载。同时也上传到CSDN,被强制成为VIP才能下载(其实我是想每个工程收1积分)。如果你刚好有VIP,就请CSDN下载支持一下,嘻嘻。没有的话,千万别开,死贵,去百度网盘下载。
通过网盘分享的文件:IO_ADC.zip
链接: https://pan.baidu.com/s/1wtQsLlgUVFpLt24pOOtUAA?pwd=br58 提取码: br58
通过网盘分享的文件:RT_driver_5.1.0_STM32G431RBTx.zip
链接: https://pan.baidu.com/s/1XsCLVMCYPWlEIj5bPXOCQg?pwd=tay6 提取码: tay6
总结
创建工程有点繁琐,如果有某些地方不会操作报错了,请下载工程,这些工程我是验证过的,没有问题。
相关文章:
基于RT-Thread的STM32G4开发第二讲第二篇——ADC
文章目录 前言一、RT-Thread工程创建二、ADC工程创建三、ADC功能实现1.ADC.c2.ADC.h3.mian.c 四、效果展示和工程分享总结 前言 本文使用的是RT-Thread最新的驱动5.1.0,兼容下面的所有驱动。使用的开发板是蓝桥杯嵌入式国信长安的开发板,MCU是STM32G431…...
居民健康监测小程序|基于微信小程序的居民健康监测小程序设计与实现(源码+数据库+文档)
居民健康监测小程序 目录 基于微信小程序的居民健康监测小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、健康科普管理 5.3公告类型管理 3、论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …...
电商双11美妆数据分析
图中展示的是在Jupyter Notebook环境下的Python代码及运行结果。代码利用 seaborn 和 matplotlib 库,以 datal 数据集为基础,绘制上下两个子图。上方子图呈现各店铺中各大类的销售量,下方子图展示各店铺中各大类的销售额,通过条形…...
Spark-Core(双Value类型)
一、RDD转换算子(双Value类型) 1、intersection 函数签名: def intersection(other: RDD[T]): RDD[T] 函数说明:对源 RDD 和参数 RDD 求交集后返回一个新的 RDD 举栗: val dataRDD1 sparkContext.makeRDD(List(…...
【数据库原理及安全实验】实验六 角色访问控制
指导书原文 安全性管理二 【实验目的】 1) 通过语句设置登录用户的权限,实现对不同用户的操作权限的限定。 【实验原理】 1) 定义数据库角色,授予该角色特定权限,建立不同的用户将其置入不同的角色之下,即等于分配了该用户不…...
windows安装micromamba
windows安装 winget install Mamba.Micromamba Set-ExecutionPolicy RemoteSigned micromamba activate 第一次运行会报错,把报错中间那一句init代码跑一下 创建环境什么的和conda一样 把conda换成micromamba就行 绑定快捷键,winget安装&#x…...
vue-quill-editor的失焦事件
vue-quill-editor的用法再此就不再赘述了,只记录我在使用过程中踩的坑。 版本:Vue2 vue-quill-editor3.0.6 封装组件: <vue-quill-editorclass"editor":class"dynamicClasses"ref"myTextEditor"v-model&quo…...
【工具变量】最新华证ESG评级得分数据-含xlsx及dta格式(2009-2024.12)
参考《经济研究》中方先明(2023)的做法,将华证ESG评级进行赋值,指标包含C、CC、CCC、B、BB、BBB、A、AA、AAA共9个等级,将上市公司ESG等级从低到高分别赋值为1至9。将华证ESG评级得分数据更新至2024年12月31日…...
【纯小白博客搭建】Hugo+Github博客部署及主题(stack)美化等界面优化记录
这里写目录标题 HugoGithub博客部署及主题(stack)美化等界面优化写在前面hugo博客搭建教程第一种方案第二种方案 添加浏览量和统计字数添加评论功能添加访客地图 HugoGithub博客部署及主题(stack)美化等界面优化 效果图如下 如果…...
题解:CF2107E Ain and Apple Tree
首先考虑无解的情况。 当这棵树为一条链时,答案取到最大值。证明很简单,假设存在一个节点 u u u 至少有 2 2 2 个孩子节点,任取两个 v 1 , v 2 v_1,v_2 v1,v2,则 dep ( LCA ( v 1 , v 2 ) ) dep ( u ) \text{dep}(\o…...
STM32的看门狗
独立看门狗(IWDG) IWDG简介 独立看门狗(Independent Watchdog,通常缩写为IWDG)主要作用是主要用于检测外界电磁干扰,或硬件异常导致的程序跑飞问题。 WDG本质上是一个12位的递减计数器(滴答定…...
小王包子铺的融资过程以及IPO上市过程
用包子铺来打个通俗易懂的比喻,一步步讲清楚从创业到融资上市的全过程。 🥟 故事背景:老王的包子铺 老王做的包子特别好吃,于是他决定不再只是摆摊,而是创办一家叫 “老王包子铺” 的连锁店。我们就以老王创业为线索&…...
WPF 触发器 Trigger
触发器 Trigger 触发器(Trigger)是 WPF 中的一种机制: 当某个条件满足时,自动改变控件的某些属性,比如颜色、大小、透明度等。 换句话说,就是"如果……那么就……" 的一种规则。 常见触发器类…...
CentOS算法部署
CentOS服务部署 第一章 启动两个算法服务第一步:上传算法文件第二步:安装 tmux第三步:启动服务(1) 启动第一个算法服务(2) 启动第二个算法服务 第四步:关闭防火墙 第一章 启动两个算…...
极狐GitLab 命名空间的类型有哪些?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 命名空间 命名空间在极狐GitLab 中组织项目。因为每一个命名空间都是单独的,您可以在多个命名空间中使用相同的项…...
使用 Apache POI 生成包含文本和图片的 Word 文档
一、概述 在实际开发场景中,我们经常需要自动生成包含文本和图片的 Word 文档。本示例借助 Apache POI 库,实现了向 Word 文档中插入文本和图片的功能。代码会循环插入多次文本和同一张图片,并且对图片进行等比缩放处理,以保证图片…...
Eclipse通过Tomcat启动web项目报错
错误内容:Caused by: java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext。 本来运行的好好的,执行了Maven->Update Porject后就报上面的错。 通过检查发现,执行上面的命令后会将下面截图中的maven depen…...
5.7线性动态规划1
P2285 [HNOI2004] 打鼹鼠 #include<bits/stdc.h> using namespace std; struct node{int x, y, t; }a[100010]; int dp[100010]; void solve(){int n, m; cin >> n >> m;for(int i 1; i < m; i){cin >> a[i].t >> a[i].x >> a[i].y;}…...
Word如何制作三线表格
1.需求 将像这样的表格整理成论文中需要的三线表格。 2.直观流程 选中表格 --> 表格属性中的边框与底纹B --> 在设置中选择无(重置表格)–> 确定 --> 选择第一行(其实是将第一行看成独立表格了,为了设置中线&…...
【Mybatis-plus常用语法】
MyBatis-Plus 是 MyBatis 的增强工具,提供了很多便捷的功能来简化开发。以下是一些 MyBatis-Plus 的常见语法: 实体类注解:使用 TableName 注解来指定实体类和数据库表的映射关系。 TableName("user") public class User {privat…...
16.Excel:数据收集
一 使用在线协作工具 简道云。 excel的在线表格协作在国内无法使用,而数据采集最需要在线协作。 二 使用 excel 1.制作表格 在使用excel进行数据采集的时候,会制作表头给填写人,最好还制作一个示例。 1.输入提示 当点击某个单元格的时候&am…...
基于Django框架开发的企业级IT资产管理系统
CMDB 资产管理系统 资产管理系统是一个基于Django框架开发的企业级IT资产管理平台,专注于数据中心和IT设备的全生命周期管理。该系统提供了完整的资产管理功能,包括设备管理、数据中心管理、用户权限管理等核心功能。 项目截图 技术栈 后端 Python 3…...
Redis 集群版本升级指南:从 Redis 7 升级到 Redis 8
Redis 集群升级主要有两种方案: 1、在线滚动升级(无需停机) 2、停机升级(需停止服务) 一、准备工作 1. 下载 Redis 8 安装包 # Redis 8.0.0 示例(请替换为实际版本) http://download.redis.io…...
使用 Couchbase Analytics Service 的典型步骤
下面是使用 Couchbase Analytics Service 的典型步骤,包括部署、配置、创建数据集、运行查询以及监控优化等环节。 首先,您需要安装并启用 Analytics 服务;然后将节点加入集群并重平衡;接着在 Analytics 中映射数据服务的集合&am…...
C++ stl中的vector的相关用法 迭代器失效问题
文章目录 vector的介绍及使用vector的定义 vector的空间相关问题vector的迭代器的使用vector的增删查改vector迭代器失效问题 vector的介绍及使用 1、vector是用于表示可变大小数组的序列容器。 2、vector就像数组一样,采用的是连续的空间来存储元素,也…...
【Redis】哨兵机制和集群
🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 一、哨兵机制 Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工的进行主从切换,同时需要大量的客户端需要被通知切换到…...
uni-app 引入vconsole web端正常,安卓端报错 Cannot read property ‘sendBeacon‘ of undefined
reportJSException >>>> exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->Uncaught TypeError: Cannot read property sendBeacon of undefined vconsole 只支持 web 端,…...
数据管道的解耦艺术:Dagster I/O管理器实现存储与逻辑分离
在现代数据工程中,高效管理数据的读写逻辑是构建可维护管道的关键。Dagster的**I/O管理器(I/O Managers)**通过分离数据处理与数据存储逻辑,显著提升了代码的可复用性和灵活性。本文将深入解析其核心概念、应用场景及实战示例。 一…...
shell脚本--2
1、实时监控cpu、内存的shell脚本 #!/bin/bash# 获取当前时间 DATE$(date "%Y-%m-%d %H:%M:%S")# 获取CPU使用情况 CPU_USAGE$(top -b -n1 | grep "Cpu(s)" | awk {print $2 $4})# 获取内存使用情况 MEMORY_USAGE$(free | grep Mem | awk {print $3/$2 *…...
jenkins配置多nexus仓库多maven版本
jenkins多环境多nexus仓库,多maven版本 使用优化,jenkins多环境多nexus仓库,多maven版本 1、多settings.xml设置构建 背景:jenkins本地安装一个maven版本,默认只有一个settings.xml文件指定本地和远端nexus仓库&#x…...
Linux理解文件fd
先来段代码回顾C文件接口 myfile.c写文件 #include <stdio.h>int main() {FILE *fp fopen("log.txt","a");if(NULL fp){perror("fopen");return 1;}fprintf(fp,"helloWorld,%d,%s,%lf\n",10,"lsf",3.14);fclose(fp)…...
【Python】os模块
os 模块是 Python 标准库中用于与操作系统交互的核心模块,提供了许多操作文件和目 录的函数。 1. 基本介绍 os 模块提供了以下主要功能: 文件和目录操作路径操作进程管理环境变量访问 import os2. 常用功能分类 2.1 文件和目录操作 函数/方法描述o…...
2025 Mac常用软件安装配置
1、homebrew 2、jdk 使用brew安装jdk: 配置环境变量: 3、maven 使用brew安装maven: 配置环境变量: 4、光标平滑移动 5、鼠标滚轮调整 mos 6、常用的终端工具 tabby 7、软件卸载 腾讯柠檬:https://lemon.qq.com/ 8、…...
PyQt5 实现自定义滑块,效果还不错
最近,黄老师闲来无事,需要做一个 播放器的滑块,但是Qt官方的长这个样子,不太好看 于是我自己写了一个,效果还不错,请看下面的效果图: 功能可以点击,可以拖拽改变进度,和播放器的进度条一样 源码如下: 需要的自取 import sys from PyQt5.QtWidgets import QApplicat…...
如何在ENVI Classic 和 ENVI中进行波段合成
示例使用Landsat的三个波段进行合成为示例,合成后展示为假彩色。 对应关系为: Red -- b4(近红外 near-infrared)NIR Green -- b3 (红光 Red) Blue -- b2 (绿光 Green) 一、ENVI…...
协方差与皮尔逊相关系数:从定义到应用的全面解析
目录 一、协方差与皮尔逊相关系数的定义1.1 协方差(Covariance)1.2 皮尔逊相关系数(Pearson Correlation Coefficient) 二、协方差的定义与推导逻辑2.1 核心目标:衡量变量的“协同变化”2.2 数学表达的直观性2.3 从线性…...
ICML 2025录取率公布,spotlight posters仅占2.6%
近日,ICML 2025公布了论文录用结果。本次大会共收到 12,107篇有效论文投稿,比去年增加了28%,今年录取论文3,260篇,录取率为 26.9%。其中仅有313篇被列为“焦点海报”(即所有投稿中排名前2.6%的论文)&#x…...
kotlin一个函数返回多个值
一、主要实现方式 1. Pair/Triple 元组 用途:临时快速返回 2 或 3 个简单值,适用于简单场景语法: fun getStatus(): Pair<Int, String> {return Pair(200, "Success") // 等价于 200 to "Success" }// 解构接收 …...
Clojure 学习笔记
Clojure哲学 1.又一种Lisp? 优美、灵活、代码即数据。 实现一门程序设计语言,代码同数据一般对待,这需要语言本身具有非常强的可塑性。当语言就是以这种本质的数据结构表现时,语言本身就可以操作自己的结构和行为了。 2.函数式编…...
5.7 react 路由
react 状态管理库 14:20 react 路由(补充) 数据路由 路由hooks 路由跳转 (方法 标签/内置方法) 获取路由地址栏信息 动态路由实现(多角色权限路由) redux redux-toolkit 状态管理 antd 组件使用 1.…...
8. HTML 表单基础
表单是网页开发中与用户交互的核心组件,用于收集、验证和提交用户输入的数据。本文将基于提供的代码素材,系统讲解 HTML 表单的核心概念、常用控件及最佳实践。 一、表单的基本结构 一个完整的 HTML 表单由以下部分组成: <form action&q…...
遥感数据处理、机器学习建模与空间预测的全流程指南——涵盖R语言(随机森林、XGBoost、SVM等)、特征提取、模型优化及生态学案例分析
随机森林是一种强大的集成学习方法,特别适用于复杂的遥感数据分析。它通过构建多棵决策树并引入随机性,有效降低模型的方差和过拟合风险。在训练过程中,随机森林利用Bootstrap抽样生成多样化的训练集,并在节点分裂时随机选择特征子…...
Android 数据持久化之数据库存储 Room 框架
一、简介 Room 是 Google 推出的 Android 持久层框架,建立在 SQLite 之上,提供了一个抽象层,简化了数据库操作。它通过注解和编译时检查来确保数据操作的正确性。 Room 主要由以下三个组件组成: Entity(实体&#x…...
空间数据分析新趋势:AI 与 ArcGIS Pro 的协同创新
技术点目录 AI(DeepSeek、ChatGPT)大模型介绍及应用AI(DeepSeek、ChatGPT)支持下空间数据处理及分析功能基础AI(DeepSeek、ChatGPT)支持下空间数据选择及读取AI(DeepSeek、ChatGPT)支…...
Oracle OCP认证考试考点详解083系列10
题记: 本系列主要讲解Oracle OCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。 46. 第46题: 题目 解析及答案: 查看以下配置: CDB1 和 CDB2 是两个容器数据库。 PDB1 是 CDB1 中的一…...
【linux常用指令】du命令
今天收到通知需要将服务器上的容量大的文件移动到大容量数据盘中。 du -sh */ | sort -h如果你想按大小排序显示文件夹,可以结合 sort 命令。这会按大小从小到大排序显示文件夹。如果想按大小从大到小排序,可以加上 -r 选项。 du -sh */ | sort -h -r...
统一返回JsonResult踩坑
定义了一个统一返回类,但是没有给Data 导致没有get/set方法,请求一直报错 public class JsonResult<T> {private int code;private String message;private T data;public JsonResult() {}public JsonResult(int code, String message, T data) {…...
MCP Client适配DeepSeek
本文是通过MCP官方的client例子进行修改,适配DeepSeek API. MCP client 先解析一下什么是MCP client。 MCP Client 是 Model Context Protocol(模型上下文协议)架构中的客户端组件,主要负责与 MCP 服务器建立和管理连接。它是一…...
物业设备管理的“多系统协同”模式:ERP、IoT与工单系统如何联动?
在智慧物业快速发展的今天,设备管理已从“被动维修”转向“主动预防”,但许多企业仍面临系统割裂、数据孤岛的困境。ERP系统记录设备台账却难实时监控,IoT设备采集数据却无法联动响应,工单系统处理流程却依赖人工流转——这些痛点…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】6.4 时间序列分析(窗口函数处理时间数据)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL时间序列分析:窗口函数处理时间数据实战一、时间序列分析核心场景与窗口函数优势1.1 业务场景需求1.2 窗口函数核心优势 二、窗口函数基础:…...