【stm32--HAL库DMA+USART+空闲中断不定长收发数据】
串口通信-Hal库实现不定长度收发,DMA+USART
- DMA
- 串口
- STM32CUBEMX配置(工程创建)
- 基础配置
- 时钟配置
- 工程配置
- 代码编写
- 现象
DMA
在正式配置之前,我们先来一起简单了解一下DMA。DMA(Direct Memory Access,直接内存访问)是一种用于处理器和外设之间传输数据的技术,通过DMA,外设可以直接访问内存中的数据,而不需要处理器的干预,从而提高数据传输的效率。举个例子:我是元始天尊,我把灵珠给太乙真人,然后通过太乙真人把灵珠给殷夫人,这是常规情况的数据传输,太乙真人就是CPU,灵珠就是数据,这样做会占用太乙真人的精力(消耗CPU的资源)。然而实际上,太乙真人在这中间仅仅只是充当了一个大自然的搬运工,这样太大材小用了,像太乙真人这样的十二金仙,有捍卫人间正道,斩妖除魔的大事儿要处理,哪儿能天天当快递员呀。于是,伟大的元始天尊(也就是我),想了一个办法,我直接用法术,把灵珠传送到殷夫人肚子里面,这就是DMA了。灵珠就是数据,法术就相当于是DMA通道,这样不但太乙真人可以去干大事儿了,灵珠也能更快到达殷夫人肚子里面了,两全其美,皆大欢喜。
这张图就是我上面描述的过程,有细心的小伙伴可能发现了,我这里用的是双向箭头,因为这里的数据传输,也是双向的,殷夫人收到灵珠了,但是她不会用呀,那她也可以通过DMA通道,找我要使用说明书;太乙真人那边同理啊,太乙真人就相当于一个客服,他可以把殷夫人的问题转述给我。所以这里数据传输是双向的,因为他只是一个通道,这个通道双方都可以使用。
串口
串口可参考我之前写的,这里不过多阐述
STM32CUBEMX配置(工程创建)
基础配置
首先打开STM32CUBEMX,选择我们的芯片(我这里用的是STM32F103C8T6)
配置GPIO:
注意,原理图用到谁,配置谁,不用的不配置,因为会浪费资源。
比如,**我现在要配置PA10、PA9,你想想你是要什么功能?是串口通讯还是普通的IO口?**可以选择:
这里因为是串口通讯,因此选用USART1_RX,同理,PA9未TX。
这里只讲串口,其他的和上述一样。
来到此处USART处:
配置参数:
来到NVIC,勾选中断
添加DMA:
时钟配置
开启此处外部晶振始终才能设置下方图片的外部晶振的参数
可以参考大佬文章:时钟超详细讲解
工程配置
创建用户的.c,.h文件
代码编写
UserUsart1.c
#include "usart.h"#include "UserUsart1.h"#include "string.h"// 发送缓冲区操作
uint8_t usart1_SendBuf[USART1_BUF_SIZE+1];
uint8_t c[USART1_BUF_SIZE+1]; // 发送缓存区
uint16_t usart1_SendLen= 0; // 发送数据长度
// 接收缓冲区操作
uint8_t usart1_RecvBuf[USART1_BUF_SIZE+1]; // 接收数据环形缓冲区
uint16_t usart1_RecvLen=0; // 环形缓冲区的当前放入位置
uint8_t usart1_recvFrame = 0; // 1 接收一个完整数据包. 0:NOvoid Usart1_init(void)
{usart1_RecvLen=0; // 清除标志usart1_recvFrame=0;memset(usart1_RecvBuf,0,USART1_BUF_SIZE); usart1_RecvLen = 0;memset(usart1_SendBuf,0,USART1_BUF_SIZE);
}// 通过DMA方式,直接发送数据,注意发送数据不能够超过缓冲区长度
// 注意数据不要溢出
uint8_t Usart1_SendData(uint8_t *buf, uint16_t Size)
{if(__HAL_DMA_GET_COUNTER(huart1.hdmatx) == 0 ) // 检查上次数据是否发送完成 {if(Size>USART1_BUF_SIZE)Size = USART1_BUF_SIZE;for(int i=0; i<Size; i++)usart1_SendBuf[i] = buf[i]; // 发送缓存区usart1_SendLen= Size; // 发送数据长度HAL_UART_DMAStop(&huart1); // 关闭DMAHAL_UART_Transmit_DMA(&huart1,usart1_SendBuf,usart1_SendLen); // 启动DMA发送 return 1;}elsereturn 0;
}// 发送完成中断,打开接收
void USART1_EndTxd_IRQHandler(void)
{usart1_SendLen = 0; // 发送完成
}// 启动新的串口读取
void Usart1_ReadData(void)
{HAL_UART_AbortReceive_IT(&huart1); // 初始化接收缓冲区usart1_RecvLen=0; // 清除标志usart1_recvFrame=0;memset(usart1_RecvBuf,0,USART1_BUF_SIZE); // BUFFER清除, 可以不用HAL_UART_Receive_IT(&huart1,usart1_RecvBuf,1); // 打开中断,接收第一个数据
}// 数据包第一个字节,串口中断接收
void USART1_RXD_IRQHandler(void)
{HAL_UART_Receive_DMA(&huart1, usart1_RecvBuf+1, USART1_BUF_SIZE-1); //打开DMA接收,数据放在g_USART1_DMA_RX_Buffer__HAL_UART_CLEAR_IDLEFLAG(&huart1); //清除标志位__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能IDLE中断
}// 串口DMA空闲中断接收
void USART1_IDLE_IRQHandler(void)
{uint32_t temp;if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET) //获取IDLE标志位,检查idle标志是否被置位{__HAL_UART_CLEAR_IDLEFLAG(&huart1); //清除标志位HAL_UART_DMAStop(&huart1); temp = USART1_BUF_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx);if(usart1_recvFrame==0 && temp>0 && temp<USART1_BUF_SIZE) {usart1_RecvLen = temp+1; //总计数减去未传输的数据个数,得到已经接收的数据个数usart1_recvFrame = 1; // 接受完成标志位置1}}
}//执行命令函数
void user_uart_process(void)
{if(usart1_recvFrame==1) // UART7 接收到数据,进行数据解析,解析完成后,将数据通过Can1发送出去{if(usart1_RecvLen>0){//此处可处理Usart1_RexBuff的数据,比如提取,数据处理等操作// HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,0);// HAL_Delay(500);//HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,1);}usart1_recvFrame =0;Usart1_ReadData();//再次开启中断,方便下次接收}
}/*******************************************************************************
此回调函数中,每次接收到的字节 xxx_Rxd_Buf[2]
因为在调用 HAL_UART_IRQHandler(&huart5);时,调用了 UART_Receive_IT(),其中
执行了 __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE),所以接收中断必须在回调函
数中重新开启,最简单的就是重复调用 HAL_UART_Receive_IT(&huart,dbg_Rxd_Buf,1)了
*******************************************************************************/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{if(UartHandle->Instance == USART1)USART1_RXD_IRQHandler(); }// UART发送完成中断调用。 UART_DMATransmitCplt 和 UART_EndTransmit_IT 调用
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle)
{if(UartHandle->Instance == USART1)USART1_EndTxd_IRQHandler();
}// 注意:注意:注意:UART空闲中断,用户自定义的,要写进it.h里
void HAL_UART_IdleCallback(UART_HandleTypeDef *UartHandle)
{if(UartHandle->Instance == USART1)USART1_IDLE_IRQHandler();
}
UserUsart1.h
#ifndef __USER_USART1_H__
#define __USER_USART1_H__
#define USART1_BUF_SIZE 256 // DMA缓冲区长度
extern void HAL_UART_IdleCallback(UART_HandleTypeDef *UartHandle);
// 发送缓冲区操作
extern uint8_t usart1_SendBuf[USART1_BUF_SIZE+1]; // 发送缓存区
extern uint16_t usart1_SendLen; // 发送数据长度
// 接收缓冲区操作
extern uint8_t usart1_RecvBuf[USART1_BUF_SIZE+1]; // 接收数据环形缓冲区
extern uint16_t usart1_RecvLen; // 环形缓冲区的当前放入位置
extern uint8_t usart1_recvFrame; // 1 接收一个完整数据包. 0:NOextern void Usart1_init(void);// 通过DMA方式,直接发送数据,注意发送数据不能够超过缓冲区长度
extern uint8_t Usart1_SendData(uint8_t *buf, uint16_t Size);
// 发送完成中断,打开接收
extern void USART1_EndTxd_IRQHandler(void);// 启动新的串口读取
extern void Usart1_ReadData(void);
// 从串口收到数据,存入缓存
extern void USART1_RXD_IRQHandler(void);
extern void USART1_IDLE_IRQHandler(void);
//命令执行
extern void user_uart_process();
#endif
stm32f1xx_it.h
的空闲中断一定要加进来,可在UserUsart1.c
的代码找到该空闲中断函数
main.c
其中main.c里面一定要注意,要先开启一次接收中断,否则收不到数据。 对于我的main函数而言,Usart1_ReadData();
函数就是开启一次中断的。
/* USER CODE BEGIN Header */
/********************************************************************************* @file : main.c* @brief : Main program body******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dma.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "UserUsart1.h"
#include <stdint.h>
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */uint8_t a[]={0x01,0x02,0x03};
/* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_USART1_UART_Init();MX_I2C1_Init();/* USER CODE BEGIN 2 */Usart1_init();/* 启动接收中断很重要,先开启一次中断,一定一定一定,不然收不到数据 */Usart1_ReadData();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *///Usart1_SendData(a,3);user_uart_process();}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();
// while (1)
// {
// }/* USER CODE END Error_Handler_Debug */
}#ifdef USE_FULL_ASSERT
/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
现象
单片机收:
单片机发:
相关文章:
【stm32--HAL库DMA+USART+空闲中断不定长收发数据】
串口通信-Hal库实现不定长度收发,DMAUSART DMA串口STM32CUBEMX配置(工程创建)基础配置时钟配置工程配置 代码编写现象 DMA 在正式配置之前,我们先来一起简单了解一下DMA。DMA(Direct Memory Access,直接内…...
5G-A技术
最近的iOS 18.4 推送了 新功能,最引人注目的便是这个5G-A的这个功能,那什么是5G-A呢 ? 目前北京 四环内 还是有能显示出5G-A标志的。 5G-A 🌐 一句话概括: 5G-A 更快的速度 更低的延迟 更强的AI能力 更智能的网…...
Vue 组件 - 动态组件
Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue 组件 - 动态组件 目录 动态组件 选项卡页面示例 更简单写法 增加输入框 弥补措施 总结 动态组件 选项卡页面示例 功能:选项卡功能,设置导航点击哪个显示相应页面。 设置三个全局组件&#…...
ffmpeg滤镜使用
ffmpeg实现画中画效果 FFmpeg中,可以通过overlay将多个视频流、多个多媒体采集设备、多个视频文件合并到一个界面中,生成画中画的效果 FFmpeg 滤镜 overlay 基本参数 x和y x坐标和Y坐标 eof action 遇到 eof表示时的处理方式,默认为重复。…...
【MVC简介-产生原因、演变历史、核心思想、组成部分、使用场景】
MVC简介 产生原因: MVC(Model-View-Controller)模式诞生于20世纪70年代,由Trygve Reenskaug在施乐帕克研究中心(Xerox PARC)为Smalltalk语言设计,目的是解决图形用户界面(GUI&…...
基于大模型的房间隔缺损手术全流程预测与方案优化研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与目标 1.3 研究方法与创新点 二、房间隔缺损概述 2.1 房间隔缺损定义与分类 2.2 发病机制与病理生理 2.3 流行病学特征 三、大模型在房间隔缺损预测中的应用原理 3.1 大模型技术简介 3.2 数据收集与预处理 3.3 模型…...
什么是 CSSD?
文章目录 一、什么是 CSSD?CSSD 的职责 二、CSSD 是如何工作的?三、CSSD 为什么会重启节点?情况一:网络和存储都断联(失联)情况二:收到其他节点对自己的踢出通知(外部 fencing&#…...
uniapp APP端在线升级(简版)
设计思路: 1.版本比较:应用程序检查其当前版本与远程服务器上可用的最新版本 2. 更新状态指示:如果应用程序是不是最新的版本,则页面提示下载最新版本。 3.下载启动:通过plus.downloader.createDownload()启动新应用…...
2024年蓝桥杯Java B组省赛真题超详解析-分布式队列
问题:你需要回答在某个时刻,队列中有多少个元素具有可见性 方案:跟踪每个副节点已经同步到主节点队列的元素数量,并找出所有副节点中同步到的最少元素数量,这个数量即为所有副节点都已经同步的元素数量。 解析&#…...
Vue3入门
环境准备: node.js vscode or webstorm 哪个熟悉用哪个 这两个都是傻瓜式安装 浏览器直接搜索 下载即可 安装: 安装完node.js之后 按住快捷键 winR 打开命令提示符输入node 将显示版本信息 接着我们通过 vite 构建vue3工程 优点: 轻量快速的热重载(HMR…...
向量库(Vector Database)概述
向量库(Vector Database)概述 1. 核心概念 向量 高维空间中的数值数组,通常由模型(如BERT、ResNet)将非结构化数据(文本、图像等)转换为嵌入向量。 向量相似性 衡量方法:余弦相…...
Oracle迁移达梦遇中断?试试SQLark的断点续迁功能!
在企业级数据迁移项目中,如果迁移单表数据量超过亿行、占用空间超过100GB时,一旦遇到网络中断或迁移报错,往往需要整表重新迁移,导致效率低下,严重影响项目进度。针对这一痛点,SQLark 支持对 Oracle→DM 的…...
上海某海外视频平台Android高级工程师视频一面
问的问题比较细,有很多小细节在里面,平时真不一定会注意到,做一个备忘: 1.Object类里面有哪些方法? Object 类是 Java 中所有类的根类,它定义了一些基本方法,供所有类继承和重写1. 常用方法 1…...
基于yolov11的汽车损伤检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
【算法介绍】 基于YOLOv11的汽车损伤检测系统是一种先进的计算机视觉技术,旨在快速准确地识别汽车的各种损伤类型。该系统利用YOLOv11模型的强大性能,实现了对车辆损伤的精确检测与分类。 该系统能够识别的损伤类型包括裂纹(crackÿ…...
华为IP(3)
DHCP Relay报文格式 DHCP Relay主要负责转发DHCP客户端与DHCP服务器之间的DHCP报文,所以DHCP Relay的报文格式只是把DHCP的报文部分字段做了相应的修改,报文格式没有发生变化 hops:表示当前DHCP报文经过DHCP中继的数目,该字段由…...
面试问题总结:qt工程师/c++工程师
C 语言相关问题答案 面试问题总结:qt工程师/c工程师 C 语言相关问题答案 目录基础语法与特性内存管理预处理与编译 C 相关问题答案面向对象编程模板与泛型编程STL 标准模板库 Qt 相关问题答案Qt 基础与信号槽机制Qt 界面设计与布局管理Qt 多线程与并发编程 目录 基础…...
【TS学习】(15)分布式条件特性
在 TypeScript 中,分布式条件类型(Distributive Conditional Types) 是一种特殊的行为,发生在条件类型作用于裸类型参数(Naked Type Parameter) 时。这种特性使得条件类型可以“分布”到联合类型的每个成员…...
四款高效数据报表工具 让数据分析更简单
概述 在数字化时代,企业和组织越来越依赖数据驱动决策,报表软件成为提高数据可视化能力、优化业务管理的关键工具。本文将为大家介绍四款功能强大的报表软件,帮助不同需求的企业找到合适的解决方案。 一、山海鲸报表 山海鲸报表是一款零代…...
QT 非空指针 软件奔溃
在用QT的实际项目中,出现如下现象: 运行软件再关闭软件,然后再运行软件会崩溃。等待5~10分钟,再运行软件,又正常,百思不得其解,后面找到原因是在头文件里定义指针变量时没有赋初nullptr&#x…...
图漾相机——C#语言属性设置
文章目录 前言1.示例程序说明2.SDK API功能介绍2.1 ListDevice2.2 Open2.3 OpenDeviceByIP2.4 Close2.5 DeviceStreamEnable2.6 DeviceStreamFormatDump2.7 DeviceStreamFormatConfig2.8 DeviceReadCurrentEnumData2.9 DeviceReadCalibData2.10 DeviceStreamOn2.11 DeviceStrea…...
WPF中viewmodel单例模式
1、单例模式介绍 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。它常用于需要全局唯一访问点的场景,如配置管理、日志记录、数据库连接等。 2、WPF 中 ViewModel 的单例实现 在 WPF 中&#…...
AI比人脑更强,因为被植入思维模型【36】时光机理论思维
giszz的理解:据说是软银孙正义提出的一种思维模型,他利用同一时间内的地区差,通过引入技术、思维,在同一地区,形成了时间差。所谓商业模式,有时就是打空间差、时间差,信息差。 一、定义 时光机…...
SQL Server:用户权限
创建 & 删除 1. 创建用户命令整理 创建 admin2 用户 -- 在 master 数据库创建登录名 USE master; BEGINCREATE LOGIN [admin2] WITH PASSWORDNCljslrl0620!, DEFAULT_DATABASE[master], CHECK_EXPIRATIONOFF, CHECK_POLICYON; END;-- 在 db03 数据库创建用户并添加到相应…...
Qt之QTextEdit控制文本滚动, 停止滚动, 开始滚动, 鼠标控制滚动
对工作台文本框进行控制。含以下内容。详细说明在源码中可查看 至最底部停止滚动开始滚动 源码分两部分. .h文件和.cpp文件 MyTextEdit.h #ifndef MYTEXTEDIT_H #define MYTEXTEDIT_H#include <QObject> #include <QTextEdit> #include <QScrollBar> #includ…...
策略模式与元数据映射模式融合 JSR 380 验证规范实现枚举范围校验
类文件 Target({ElementType.METHOD,ElementType.FIELD,ElementType.ANNOTATION_TYPE,ElementType.CONSTRUCTOR,ElementType.PARAMETER,ElementType.TYPE_USE }) Retention(RetentionPolicy.RUNTIME) Documented Constraint(validatedBy {InEnumValidator.class, InEnumColle…...
9对象树(3)
目录 创建自定义的类,最主要的目的,是自定义一个析构函数,在析构函数中,完成打印.方便咱们看到最终的自动销毁对象的效果!!! 写完一个函数的声名之后, 按下 altenter, 在按下enter就可以自动的在对应的 cpp 文件中添加函数的定义了 内置类型,析构不会明…...
深入 OpenPDF:高级 PDF 生成与操作技巧
1 引言 1.1 项目背景 在许多企业级应用中,生成和操作 PDF 文档是一个常见的需求。PDF(Portable Document Format)因其格式统一、易于打印和分发而被广泛使用。本文将介绍如何使用 OpenPDF 库在 Java 项目中生成和操作 PDF 文档。 1.2 技术选型理由 OpenPDF:OpenPDF 是一…...
电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法
调整电脑屏幕的亮度对于保护视力和适应不同环境光线条件非常重要。无论是在白天强光下还是夜晚昏暗环境中,合适的屏幕亮度都能让您的眼睛更加舒适。本文中简鹿办公小编将向您介绍几种在 Windows 系统中调整屏幕亮度的方法。 方法一:使用快捷键 大多数笔…...
Navicat导出mysql数据库表结构说明到excel、word,单表导出方式记录
目前只找到一张一张表导出的方式 使用information_schema传入表名查询 字段名根据需要自行删减,一般保留序号、字段名、类型、说明就行 SELECT COLUMNS.ORDINAL_POSITION AS 序号, COLUMNS.COLUMN_NAME AS 字段名, COLUMNS.COLUMN_TYPE AS 类型(长度), COLUMNS.N…...
【C++笔记】C++常见二叉树OJ和拓扑排序
【C笔记】C常见二叉树OJ和拓扑排序 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】C常见二叉树OJ和拓扑排序前言一.二叉树OJ1.1 根据二叉树创建字符串1.2 二叉树的层序遍历1.3 二叉树的最近公共祖先1.4 将二叉搜索…...
ARM-----数据处理、异常处理、模式切换
实列一: 1. 异常向量表 area reset, code, readonly code32 entry area reset, code, readonly:定义一个名为reset的代码区域,只读。 code32:指示编译器生成32位ARM指令。 entry:标记程序的入口点。 2. 程序入口…...
mapbox基础,使用geojson加载line线图层,实现铁路黑白间隔效果
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️line线图层样式二、🍀使用geojson加载…...
Python FastAPI + Celery + RabbitMQ 分布式图片水印处理系统
FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理 首先创建项目结构: c:\Users\Administrator\Desktop\meitu\ ├── app/ │ ├── __init__.py │ ├── main.py │ ├── celery_app.py │ ├── tasks.py │ └── config.py…...
阶段项目:Windows 服务器的组建与管理
项目概述 公司简介 创鑫公司是一家新成立的小型 IT 公司 公司决定组建部署一个小型的企业网络 员工人数不到20人 使用一台独立的 Windows 服务器提供各种网络服务 网络拓扑 设计需求 权限部分 权限部分要求 公司的网络管理员对办公计算机和服务器分别进行独立管理ÿ…...
【408】26考研-王道计算机408
王道408考研全套视频资料: 讲义01.26考研王道计算机【C语言督学营】02.【408领学班】26考研王道计算机B站独家03.26考研王道计算机【组成原理领学班】04.26王道计算机【计算机网络领学班】05.26考研王道计算机【数据结构领学班】06.26王道计算机【操作系统领学班】…...
数据分析问题思考路径
一、思考问题 1. 确认问题 因为背景: 因为5月1日的营业额突然下滑了10%,而历史从未出现过类似的跌幅 我想目的: 我想知道本次下滑的原因以此避免再出现这样的异常情况 现在思路: 现在能想到是原因是节假日和产品环节转化异常 最后感谢: 想请你帮我取数分析一下,…...
vue省市区懒加载,用el-cascader 新增和回显
el-cascader对于懒加载有支持方法,小难点在于回显的时候,由于懒加载第一次只有一层,所以要根据选中id数组一层层的加载。 子组件 <template><el-cascaderref"cascaderRef"v-model"selectedValue":props"…...
从零构建大语言模型全栈开发指南:第三部分:训练与优化技术-3.3.3领域适配案例:医疗文本分类与法律合同生成
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 从零构建大语言模型全栈开发指南-第三部分:训练与优化技术-3.3.3 领域适配案例:医疗文本分类与法律合同生成1. 领域适配的核心挑战与解决方案2. 医疗文本分类:从通用到专业的跃迁2.1 医疗领域适配的技…...
Web网页内嵌 Adobe Pdf Reader 谷歌Chrome在线预览编辑PDF文档
随着数字化办公的普及,PDF文档已成为信息处理的核心载体,虽然桌面端有很多软件可以实现预览编辑PDF文档,而在线在线预览编辑PDF也日益成为一个难题。 作为网页内嵌本地程序的佼佼者——猿大师中间件,之前发布的猿大师办公助手&am…...
Python WebSockets 库详解:从基础到实战
1. 引言 WebSocket 是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等。相比传统的 HTTP 轮询方式,WebSocket 减少了带宽开销,提高了实时性。 在 Python 中ÿ…...
php根据一个数组里面的元素顺序来排序另外一个数组的的顺序
根据arr2的顺序来排序arr $arr [[size_id > 9],[size_id > 1],[size_id > 1],[size_id > 6],[size_id > 6],[size_id > 8],];$arr2 [1,9,6,8];usort($arr, function ($item1, $item2) use ($arr2) {return array_search($item1[size_id], $arr2) - array_s…...
从JVM到分布式锁:高并发架构设计的六把密钥
【300秒速览分布式核心技术栈】 作为十年架构老兵,今天用一张图说透高并发系统的底层逻辑: 🔑 JVM锁:synchronized与AQS构筑单机防线,却难逃分布式困局 🔑 数据库锁:MySQL行锁/间隙锁守住…...
《深度剖析SQL游标:复杂数据处理场景下的智慧抉择》
在数据库领域的广袤天地中,SQL游标宛如一把独特的钥匙,为复杂数据处理场景开启了一扇充满可能的大门。它以一种细腻且精准的方式,穿梭于数据库的记录之间,为众多棘手的数据处理难题提供了解决之道。 复杂数据处理场景的挑战 随着…...
【数据分享】中国3254座水库集水区特征数据集(免费获取)
水库在水循环、碳通量、能量平衡中扮演关键角色,实实在在地影响着我们的生活。其功能和环境影响高度依赖于地理位置、上游流域属性(如地形、气候、土地类型)和水库自身的动态特征(如水位、蒸发量)。但在此之前一直缺乏…...
【蓝桥杯每日一题】4.1
🏝️专栏: 【蓝桥杯备篇】 🌅主页: f狐o狸x "今日秃头刷题,明日荣耀加冕!" 今天我们来练习二分算法 不熟悉二分算法的朋友可以看:【C语言刷怪篇】二分法_编程解决算术问题-CSDN博客 …...
PHY——LAN8720A 代码解析 (三)
文章目录 PHY——LAN8720A 代码解析 (三)PHY 源码解析ETH_PHY_IO_InitETH_PHY_IO_DeInitETH_PHY_IO_WriteRegETH_PHY_IO_ReadRegETH_PHY_IO_GetTick LAN8720 源码解析LAN8720_RegisterBusIOLAN8720_InitLAN8720_DisablePowerDownModeLAN8720_EnablePowerDownMode PHY——LAN872…...
【工具】BioPred一个用于精准医疗中生物标志物分析的 R 软件包
介绍 R 语言包 BioPred 提供了一系列用于精准医疗中的亚组分析和生物标志物分析的工具。它借助极端梯度提升(XGBoost)算法,并结合倾向得分加权和 A 学习方法,帮助优化个体化治疗规则,从而简化亚组识别过程。BioPred 还…...
如何修复 SQL Server 数据库中的恢复挂起状态?
原文:如何修复 SQL Server 数据库中的恢复挂起状态? | w3cschool笔记 当我们想与关系数据库交互时,SQL 就会出现并帮助用户与数据库进行交互。SQL 从高级语言中获取用户的输入,然后访问将代码转换为机器可理解的形式。SQL 确实会…...
C++11QT复习 (十)
基类与派生类之间的转换 **Day7-4 基类与派生类之间的转换****一、问题回顾****二、基类与派生类间的转换****1. 类型适应(Upcasting)****2. 逆向转换(Downcasting)** **三、代码示例****四、派生类间的复制控制****五、总结****1…...
Linux——冯 • 诺依曼体系结构操作系统初识
目录 1. 冯 • 诺依曼体系结构 1.1 冯•诺依曼体系结构推导 1.2 内存提高冯•诺依曼体系结构效率的方法 1.3 理解数据流动 2. 初步认识操作系统 2.1 操作系统的概念 2.2 设计OS的目的 3. 操作系统的管理精髓 1. 冯 • 诺依曼体系结构 1.1 冯•诺依曼体系结构推导 计算…...