ESP32开发入门(四):ESP32-s3多串口开发实践
摘要
本文详细介绍ESP32-S3芯片的UART外设开发方法,涵盖UART0(默认调试串口)、UART1和UART2的配置与使用技巧,并提供完整示例代码,帮助开发者快速实现多设备串口通信。
一、ESP32-S3串口硬件资源
ESP32-S3芯片提供3个UART控制器:
控制器 | 默认引脚 | 特性 |
---|---|---|
UART0 | GPIO43(TX)、44(RX) | 通常用于USB CDC调试输出 |
UART1 | GPIO17(TX)、18(RX) | 可自由映射引脚 |
UART2 | 无默认引脚 | 完全灵活配置 |
二、开发环境准备
2.1 硬件要求
-
ESP32-S3开发板(如ESP32-S3-DevKitC-1)
-
USB数据线
-
逻辑分析仪(可选,用于调试)
2.2 软件要求
-
vsCode + PlatformIO
-
驱动:CP210x/CH340 USB转串口驱动
-
库:
HardwareSerial.h
(内置)
三、三串口配置实战
3.1 UART0 - 调试串口配置
UART0默认连接USB-OTG,用于Serial Monitor调试输出:
void setup() {// 初始化UART0,波特率115200Serial.begin(115200);// 等待串口连接while(!Serial);Serial.println("UART0初始化完成");
}
void loop() {Serial.println(millis()); // 打印系统运行时间delay(1000);
}
3.2 UART1 - 可重映射串口
UART1默认使用GPIO17/18,但可以重映射:
HardwareSerial uart1(1); // 创建UART1实例
void setup() {// 初始化UART1,自定义引脚uart1.begin(115200, SERIAL_8N1, 5, 6); // TX=5, RX=6// 发送测试数据uart1.println("UART1初始化成功");
}
void loop() {// 双向通信示例if(uart1.available()) {String data = uart1.readString();Serial.print("收到UART1数据: ");Serial.println(data);}
}
3.3 UART2 - 全功能串口
UART2需要完全手动配置:
HardwareSerial uart2(2); // 创建UART2实例
void setup() {// 初始化UART2,波特率9600uart2.begin(9600, SERIAL_8N1, 7, 8); // TX=7, RX=8// 设置中断回调uart2.onReceive({Serial.println("UART2收到数据!");});
}
void loop() {// 定时发送数据static uint32_t lastSend = 0;if(millis() - lastSend > 2000) {uart2.printf("时间戳: %lu\n", millis());lastSend = millis();}
}
四、多串口协同工作示例
4.1 温湿度数据采集转发系统
#include <Arduino.h>
#include <HardwareSerial.h>
// 串口定义
HardwareSerial uart1(1);
HardwareSerial uart2(2);
// 模拟传感器读数
float readTemperature() { return random(200, 350)/10.0; }
float readHumidity() { return random(300, 800)/10.0; }
void setup() {Serial.begin(115200);uart1.begin(115200, SERIAL_8N1, 17, 18); // 默认引脚uart2.begin(9600, SERIAL_8N1, 8, 9); // 自定义引脚Serial.println("多串口系统启动");
}
void loop() {// 每5秒采集并转发数据static uint32_t lastTime = 0;if(millis() - lastTime > 5000) {float temp = readTemperature();float hum = readHumidity();// UART1发送JSON格式uart1.printf("{\"temp\":%.1f,\"hum\":%.1f}\n", temp, hum);// UART2发送CSV格式uart2.printf("%.1f,%.1f\n", temp, hum);// 串口监视器显示Serial.printf("数据已发送: %.1fC, %.1f%%\n", temp, hum);lastTime = millis();}
}
4.2 使用freeROST实时操作系统来实现
#include <Arduino.h>
#include <HardwareSerial.h>
// UART1 引脚配置 (ESP32-S3默认: TX=17, RX=18)
#define UART1_TX_PIN 17
#define UART1_RX_PIN 18
// UART2 引脚配置 (自定义)
#define UART2_TX_PIN 8
#define UART2_RX_PIN 9
// 创建UART实例
HardwareSerial uart1(1);
HardwareSerial uart2(2);
// 数据结构
typedef struct {float temperature;float humidity;uint32_t timestamp;
} SensorData;
// FreeRTOS任务句柄
TaskHandle_t uart1TaskHandle = NULL;
TaskHandle_t uart2TaskHandle = NULL;
// 模拟读取传感器数据
SensorData readSensorData() {SensorData data;data.temperature = random(200, 350) / 10.0f; // 20.0°C ~ 35.0°Cdata.humidity = random(300, 800) / 10.0f; // 30.0% ~ 80.0%data.timestamp = millis();return data;
}
// 通过UART1发送数据的任务
void uart1SendTask(void *pvParameters) {const TickType_t xDelay = pdMS_TO_TICKS(3000); // 3秒间隔while(1) {// 读取传感器数据SensorData data = readSensorData();// 准备JSON格式数据char jsonBuffer[128];snprintf(jsonBuffer, sizeof(jsonBuffer),"{\"uart\":1,\"temp\":%.1f,\"hum\":%.1f,\"time\":%lu}",data.temperature, data.humidity, data.timestamp);// 通过UART1发送数据uart1.println(jsonBuffer);// 调试信息Serial.printf("[UART1发送] %s\n", jsonBuffer);vTaskDelay(xDelay);}
}
// 通过UART2发送数据的任务
void uart2SendTask(void *pvParameters) {const TickType_t xDelay = pdMS_TO_TICKS(5000); // 5秒间隔while(1) {// 读取传感器数据SensorData data = readSensorData();// 准备CSV格式数据char csvBuffer[64];snprintf(csvBuffer, sizeof(csvBuffer),"%.1f,%.1f,%lu", data.temperature, data.humidity, data.timestamp);// 通过UART2发送数据uart2.println(csvBuffer);// 调试信息Serial.printf("[UART2发送] %s\n", csvBuffer);vTaskDelay(xDelay);}
}
void setup() {// 初始化USB串口(用于调试)Serial.begin(115200);// 初始化UART1 (JSON格式)uart1.begin(115200, SERIAL_8N1, UART1_RX_PIN, UART1_TX_PIN);// 初始化UART2 (CSV格式)uart2.begin(9600, SERIAL_8N1, UART2_RX_PIN, UART2_TX_PIN);// 等待串口初始化while(!Serial);Serial.println("\nESP32-S3 双UART温湿度数据发送示例");Serial.printf("UART1配置: TX=%d, RX=%d (JSON格式, 3秒间隔)\n", UART1_TX_PIN, UART1_RX_PIN);Serial.printf("UART2配置: TX=%d, RX=%d (CSV格式, 5秒间隔)\n", UART2_TX_PIN, UART2_RX_PIN);// 创建发送任务xTaskCreate(uart1SendTask, // 任务函数"UART1 Send Task", // 任务名称2048, // 堆栈大小NULL, // 参数1, // 优先级&uart1TaskHandle // 任务句柄);xTaskCreate(uart2SendTask, // 任务函数"UART2 Send Task", // 任务名称2048, // 堆栈大小NULL, // 参数1, // 优先级&uart2TaskHandle // 任务句柄);Serial.println("系统初始化完成,开始发送数据...");
}
void loop() {// 主循环保持空闲,所有工作由任务完成static uint32_t lastHeapPrint = 0;if(millis() - lastHeapPrint > 10000) { // 每10秒打印一次内存状态Serial.printf("[系统] 空闲内存: %d bytes\n", ESP.getFreeHeap());lastHeapPrint = millis();}delay(1000);
}
4.3 性能优化技巧
-
使用DMA缓冲:
#include <driver/uart.h>
void setup() {// 配置UART1使用DMA缓冲区uart_param_config(UART_NUM_1, &uart_config);uart_driver_install(UART_NUM_1, 2048, 2048, 0, NULL, 0);
}
-
中断优先级设置:
void setup() {// 设置UART2中断优先级uart_isr_free(UART_NUM_2);uart_isr_register(UART_NUM_2, uart2_isr, NULL, ESP_INTR_FLAG_IRAM | ESP_INTR_FLAG_LEVEL3, NULL);
}
五、常见问题解答
Q1: 如何解决串口数据丢失问题?
A:
-
检查波特率是否匹配
-
增加硬件流控(RTS/CTS)
-
使用环形缓冲区和DMA
Q2: 多串口同时工作时如何避免冲突?
A:
-
为每个UART分配独立任务
-
使用互斥锁保护共享资源
-
设置不同的中断优先级
Q3: 如何自定义UART引脚?
A: 在begin()
函数中指定TX/RX引脚:
uart2.begin(115200, SERIAL_8N1, custom_tx_pin, custom_rx_pin);
六、总结
本文全面介绍了ESP32-S3的三UART开发方法,关键要点:
-
UART0默认用于调试,不建议复用
-
UART1提供灵活的引脚重映射能力
-
UART2适合连接外部设备
-
多串口协同需注意资源分配和冲突避免 进阶学习:
-
ESP32-S3技术参考手册
-
Arduino HardwareSerial源码分析
-
点赞 👍 收藏 ⭐ 关注 ➕ 获取更多嵌入式开发干货!
相关文章:
ESP32开发入门(四):ESP32-s3多串口开发实践
摘要 本文详细介绍ESP32-S3芯片的UART外设开发方法,涵盖UART0(默认调试串口)、UART1和UART2的配置与使用技巧,并提供完整示例代码,帮助开发者快速实现多设备串口通信。 一、ESP32-S3串口硬件资源 ESP32-S3芯片提供3个UART控制器࿱…...
树莓派学习专题<10>:使用V4L2驱动获取摄像头数据--申请和管理缓冲区
树莓派学习专题<10>:使用V4L2驱动获取摄像头数据--申请和管理缓冲区 1. 申请和管理缓冲区代码2. 代码解析3. 实测结果 1. 申请和管理缓冲区代码 /* 数据缓冲区 */ typedef struct tag_BufDesc {void *pvBufPtr ;size_t szBuf…...
Android10.0 Android.bp文件详解,以及内置app编写Android.bp文件
1.前言 在10.0的系统rom定制化开发中,在内置app的时候都是常用的用法,用Android.mk的常用,但是某些时候,会 使用Android.bp的方式来内置app,接下来就来使用常用的方式来写内置so aar jar等文件 2.Android.bp文件详解,以及内置app编写Android.bp文件的介绍 根据设计,An…...
git回退commit
在Git中回退提交(commit)主要有两种方法:使用 `git reset` 或 `git revert`,具体取决于是否需要保留提交历史或是否已推送到远程仓库。以下是详细步骤: 一、使用 `git reset`(适合本地未推送的提交) `git reset` 会移动分支的 HEAD 指针到指定提交,可选择是否保留修改。…...
arcpy列表函数的应用(4)
动态获取字段信息 在处理要素类或表时,可能需要动态获取字段信息,以便根据字段类型或名称进行特定操作。可以使用arcpy.ListFields()函数获取字段列表,并根据需要筛选字段。 示例: python # 获取指定要素类的所有字段 fields …...
02 业务流程架构
业务流程架构提供了自上而下的组织鸟瞰图,是业务流程的全景图。根据所采用的方法不同,有时被称为流程全景图或高层级流程图,提供了业务运营中所有业务流程的整体视图。 这样有助于理解企业内部各个业务流程之间的相互关系以及它们如何共同工…...
「Mac畅玩AIGC与多模态01」架构篇01 - 展示层到硬件层的架构总览
一、概述 AIGC(AI Generated Content)系统由多个结构层级组成,自上而下涵盖交互界面、API 通信、模型推理、计算框架、底层驱动与硬件支持。本篇梳理 AIGC 应用的六层体系结构,明确各组件在系统中的职责与上下游关系,…...
如何有效防止 SQL 注入攻击?
🔒 如何有效防止 SQL 注入攻击? SQL 注入(SQL Injection)是黑客通过构造恶意输入,篡改 SQL 查询语句的攻击方式。以下是 7 大防御策略,涵盖开发、测试和运维全流程。 ✅ 1. 使用参数化查询(Pre…...
路由交换网络专题 | 第九章 | NAT地址转换 | NAT回流
拓扑图 (1)配置实现内网用户可以通过 NAT 转换地址访问外网。 // 配置一条静态路由通往PC2 [AR1]ip route-static 0.0.0.0 0 60.1.1.10 // 配置ACL匹配网段 [AR1]acl 2000 [AR1-acl-basic-2000]rule permit source 192.168.1.10 0.0.0.0 // 设置地址池(不…...
DFPatternFunctor遍历计算图
文件:include/tvm/relay/dataflow_pattern_functor.h 功能:定义 DFPatternFunctor 基类,为 DFPattern 提供访问者模式(Visitor Pattern)的实现框架,支持对不同类型的模式节点进行差异化处理。 继承关系: template &…...
Spring Boot中@RequestParam、@RequestBody、@PathVariable的区别与使用
Spring Boot中RequestParam、RequestBody、PathVariable的区别与使用 前言 在当今的Web开发领域,Spring Boot凭借其简洁、高效和强大的功能,成为了Java开发者构建Web应用的首选框架。在开发过程中,处理来自客户端的请求参数是一项常见且关键…...
大模型 SFT 中的关键技术总结学习
文章目录 微调策略LoRA 微调核心思想具体实现过程超参数与技巧实现步骤 QLoRA 相关技术1. 核心原理2. 技术优势3. 实现流程4. 应用场景 P-tuning核心思想关键技术点训练流程优点应用场景 P-tuning v2Prefix Tuning一、关键概念前缀(Prefix)虚拟标…...
AI如何重塑DDoS防护行业?六大变革与未来展望
一、AI驱动的攻击与防御:攻防博弈的全面升级 AI技术的引入使DDoS攻防进入“智能对抗”时代,攻击者与防御方均借助AI提升效率,形成新的技术平衡。 1. 攻击端:AI赋能攻击的智能进化 动态流量生成:攻击者利用生成对抗网…...
电池的寿命
思路: 首先,我们观察发现:由于每枚电池的使用时间不同,而我们又要减少浪费才能使所有电池加起来用得最久,不难发现:当n2时,输出较小值。 第一步:将电池分为两组,使两组…...
Android完整开发环境搭建/Studio安装/NDK/本地Gradle下载配置/创建AVD/运行一个Android项目/常用插件
目录 安装Android Studio 修改sdk位置 配置 HTTP 代理 安装 NDK 设置快捷键 Gradle 说明 setting.gradle init.gradle build.gradle 下载 相关设置 创建项目 阿里云加速 清理缓存并同步 创建AVD 实用插件 ADB Idea Android Drawable Importer GsonFormat …...
【KWDB 创作者计划】_KWDB引领数据库技术革新的璀璨之星
【KWDB 创作者计划】_KWDB引领数据库技术革新的璀璨之星 🌟嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 在当今数字化浪潮汹涌澎湃的时代&…...
设计模式--桥接模式详解
桥接模式(bridge pattern) 桥接模式时将抽象部分与它的实现部分分离,使他们可以独立的变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或者接口(interface)模式&…...
Python+Selenium+Pytest+Allure PO模式UI自动化框架
一、框架结构 allure-report:测试报告base:定位元素封装data:数据log:日志文件page:页面封装文件夹report:缓存报告testcases:测试用例层utils:工具类run.py:执行文件 二…...
【C语言操作符详解(一)】--进制转换,原反补码,移位操作符,位操作符,逗号表达式,下标访问及函数调用操作符
目录 一.操作符的分类 二.二进制和进制转换 2.1--2进制转10进制 编辑 2.1.1--10进制转2进制数字 2.2--2进制转8进制和16进制 2.2.1--2进制转8进制 2.2.2--2进制转16进制 三.原码,反码,补码 四.移位操作符 4.1--左移操作符 4.2--右移操作符…...
回顾|Apache Cloudberry™ (Incubating) Meetup·2025 杭州站
2025 年 4 月 19 日,由酷克数据与中启乘数联合举办的 Apache Cloudberry™ (Incubating) Meetup 杭州站在浙江省杭州市滨江区滨江会展中心成功举办。本次活动邀请了 Cloudberry PPMC 团队成员、活跃内核贡献者以及中兴 EBASE-A、阿里云 ADB-PG、网易、中启乘数等多…...
使用 Autofac 实现依赖注入
前言:接上一篇文章,有了微软官方的依赖注入组件Microsoft.Extensions.DependencyInjection, 那么今天介绍一个新的开源的依赖注入组件Autofac 一、二者的差异Autofac和微软官方的依赖注入组件(Microsoft.Extensions.DependencyIn…...
HTTP:十二.HTTPS
HTTPS 概述 超文本传输安全协议(英语:HyperText Transfer Protocol Secure,缩写:HTTPS;常称为HTTP over TLS、HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,利用TLS加密数据包。 HTTPS的主要目的是提供对网站服务器…...
《代码整洁之道》第12章 迭进 - 笔记
好的设计是如何形成的? 章节核心: 好的软件设计不是完全靠前期庞大的设计方案来完成的,而更多地是在持续的编码、测试和重构过程中,“涌现”或“演进”出来的。 设计不是一次性的前期活动 大白话: 作者认为&#x…...
数字巴别塔:全栈多模态开发框架如何用自然语言重构软件生产关系?
一、自然语言编程的范式革命 1. 从代码行数到语义密度 开发效率对比(某金融 SaaS 案例): 开发方式代码量(行)开发时间(天)维护成本($/年)传统 React5,2004512,000低代码…...
【C语言极简自学笔记】C 语言数组详解:一维数组与二维数组
在 C 语言中,数组是一种非常重要的数据结构,它可以将多个相同类型的元素组织在一起,以便于我们进行批量处理和操作。本文将详细介绍 C 语言中的一维数组和二维数组,包括它们的定义、初始化、元素访问以及内存存储等方面的内容。 …...
从零构建云原生秒杀系统——后端架构与实战
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:秒杀系统的挑战与机遇 在电商、票务、抢购等业务场景中,“秒杀”系统扮演着至关重要的角色。 秒杀活动通常会在极短时间内爆发出数十倍至数百倍的平时流量,这对后端系统的承载能力、响应…...
Linux Socket编程:从API到实战
Linux Socket编程完全指南:从API到实战 概述 Socket(套接字)是网络编程的基础,它允许不同主机或同一主机上的不同进程之间进行通信。在Linux系统中,Socket编程主要通过一系列系统调用来实现,这些API提供了…...
德州仪器(TI)—TDA4VM芯片详解(1)—产品特性
写在前面 本系列文章主要讲解德州仪器(TI)TDA4VM芯片的相关知识,希望能帮助更多的同学认识和了解德州仪器(TI)TDA4VM芯片。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 错过其他章节的同学…...
增强版wps-plugin-deepseek开源插件是DeepSeek 支持的 WPS 插件,在您的办公工作流程中提供智能文档自动化和 AI 驱动的生产力增强
一、软件介绍 文末提供程序和源码下载学习 增强版wps-plugin-deepseek开源插件专为WPS Office插件开发打造的Vue模板,搭配Vite构建工具,提供丰富的WPS API实操示例。虽然官方提供了TypeScript扩展包,但支持程度有限,因此本项目选…...
在 Cursor 中 配置 GitHub MCP Server
文章目录 1、简单回顾 sequentialthinking 的安装2、提出问题:如何在 cursor 配置 github mcp 呢3、结果如下How to Configure GitHub MCP in CursorPrerequisitesStep 1: Update Cursor (if needed)Step 2: Generate a GitHub Personal Access TokenStep 3: Open Cursor MCP S…...
uniapp-商城-40-shop 购物车 选好了 进行订单确认4 配送方式3 地址编辑
前面说了配送 和地址页面 当地址页面为空或需要添加地址时,需要添加地址。 我的地址页面有个按钮 就是添加地址 点击 添加地址 按钮 后,就会跳转到地址添加的页面 1、添加地址页面 2、添加地址文件夹以及文件的创建 3、添加地址的代码 <template…...
初步自定义layui的table(laravel 12)
layui的table是非常好的表格,有美观的样式,对接起来也很便捷。使用后端翻页传过来的数据,本地测试是好的,部署到服务器时,翻页不起作用。故而暂时采用一次性读取全部数据,发送给table,界面如下所…...
手写SpringMVC(基本框架)
服务器启动阶段处理 分析服务器启动阶段都都需要初始化什么? 1.初始化Spring容器 组件扫描包下的类纳入IOC容器管理创建视图解析器对象创建所有的拦截器对象扫描这和包下的所有类org.myspringmvc.web.servlet.mvc.method.annotation,全部实例化&#…...
JS-OCR-demo加载本地文件
背景: 在了解 Tesseract 的识别效果的时候,有个demo项目很好用。有个小毛病,就是没事都要从摄像头抓取图片,然后进行识别。如果可以从本地读取图,就更方便了。 实现: 下载项目代码:https://gi…...
MySQL 表的约束(一)
文章目录 表的约束空属性默认值列描述zerofill主键总结 表的约束 1. 为什么要有表的约束? 因为要保证数据的完整性和可约束性,合法性 空属性 两个值:null(默认的)和not null(不为空)数据库默认字段基本都是字段为空…...
论文导读 - 基于大规模测量与多任务深度学习的电子鼻系统实现目标识别、浓度预测与状态判断
基于大规模测量与多任务深度学习的电子鼻系统实现目标识别、浓度预测与状态判断 原论文地址:https://www.sciencedirect.com/science/article/abs/pii/S0925400521014830 引用此论文(GB/T 7714-2015): WANG T, ZHANG H, WU Y, …...
力扣hot100_子串_python版本
一、560. 和为 K 的子数组 思路:这就是一道典型的前缀和的题代码: class Solution:def subarraySum(self, nums: List[int], k: int) -> int:presum [0] * (len(nums) 1)for i, x in enumerate(nums):presum[i 1] presum[i] x # 前缀和序列需要n1个ans 0…...
cached-property - 类属性缓存装饰器
本文翻译整理自:https://github.com/pydanny/cached-property 文章目录 一、关于 cached-property相关链接资源关键功能特性 二、安装三、使用指南1、基础用法2、手动清除缓存3、线程安全版本4、异步支持5、缓存超时(TTL) 四、致谢 一、关于…...
「Mac畅玩AIGC与多模态03」部署篇02 - 在 Mac 上部署 Dify
一、概述 本篇介绍如何在 macOS 环境下本地部署 Dify 平台,作为多模型协同与工作流集成的可视化应用服务。Dify 提供了模型调用、对话管理、知识库问答、插件服务等功能,可与 Ollama、OpenAI、DeepSeek 等推理后端集成,适用于本地智能体应用的快速搭建与扩展。 二、部署流…...
扩散模型和马尔科夫链
1. 扩散模型的基本原理 扩散模型的灵感来源于热力学扩散(如一滴墨水在水中逐渐扩散的过程),其核心分为两个阶段: 前向过程(Forward Process):逐步向数据添加噪声,直到数据完全变为随…...
Dify框架面试内容整理-Dify如何处理知识库的集成?
Dify 在知识库集成方面采用了“检索增强生成(RAG)”的技术架构,核心实现思路如下: 一、知识库集成的整体流程 Dify处理知识库集成通常包括以下关键步骤: 文档上传↓...
第35课 常用快捷操作——用“鼠标左键”拖动图元
概述 拖动某个图元,是设计过程中常需要用到的操作,我们可以在原理图中拖动某个元器件符号,也可以在PCB图中拖动某个焊盘。 和常用的软件类似,用按住鼠标左键的方式来完成拖动操作。 用鼠标左键拖动图元 在想要拖动的图元上&…...
复盘笔记1
以下是一份专业股市投资操盘手的复盘清单,涵盖市场分析、交易策略、风险管理等核心环节,帮助系统化梳理每日交易并优化次日决策: --- ### **一、市场整体复盘** 1. **指数与成交量分析** - 主要指数表现(上证、深证、创业板、科…...
海思dump图原理
在海思中是用指令进行对应的dump。 例如./vi_chn_dump 0 0 1 1 第一个指令代表是dump哪里的数据。 第一个0代表是vi_pipe。 第二个0代表vi_chn。 第一个1代表需要dump帧的数量。 第二个dump代表dump帧的位置,如果是0表示dump的是在所有ISP模块后面的数据࿰…...
C++:STL——list
一简介 底层是一个带头双向循环列表 二、成员函数 (1)构造函数 三、迭代器 四、修饰函数 (1)insert 插入和删除不再使用下标,而是使用迭代器指针作为要插入位置的形参,这是因为:vector是连续的…...
在Azure Databricks中实现缓慢变化维度(SCD)的三种类型
在Azure Databricks中使用PySpark实现缓慢变化维度(SCD)的三种核心类型,需结合Spark SQL和DataFrame API的特性,并利用Delta Lake的事务支持。以下是具体设计与实现步骤,以及测试用例: 通过以下步骤&#…...
Segment Anything in Images and Videos
目录 摘要 Abstract SAM2 模型框架 图像编码器 记忆机制 提示编码器和掩码解码器 实验 代码 总结 摘要 SAM2是基于Meta公司推出的Segment Anything Model升级而来的先进分割模型。它在SAM的基础上,通过引入记忆注意力模块和优化图像编码器等改进…...
C++之异常
目录 一、异常的概念及使用 1.1、异常的概念 1.2、异常的抛出和捕获 1.3、栈展开 1.4、查找匹配的处理代码 1.5、异常重新抛出 1.6、异常安全问题 1.7、异常规范 1.8、C异常的优缺点 二、标准库的异常 一、异常的概念及使用 1.1、异常的概念 异常处理机制允许程序中…...
服务器不能复制粘贴文件的处理方式
1.打开远程的服务器,在服务器的任务栏随便一块空白处右击鼠标,选择“启动任务管理器”。 2.在打开的任务管理器中,我们找到“rdpclip.exe”这个进程,如果没有找到那么如图所示 任务管理器–文件–运行新任务,然后在弹出的对话框内输入rdpclip.exe 如下图࿱…...
Golang | 搜索表达式
// (( A | B | C ) & D ) | E & (( F | G ) & H )import "strings"// 实例化一个搜索表达式 func NewTermQuery(field, keyword string) *TermQuery {return &TermQuery{Keyword: &Keyword{Field: field, Word: keyword},} }func (tq *TermQuery…...