在QML中获取当前时间、IP和位置(基于网络请求)
目录
- 引言
- 相关阅读
- 最终效果
- 代码详解
- 1. 基础框架与窗口设置
- 2. IP定位功能实现
- 3. IP获取功能
- 4. 时间更新与应用初始化
- 5. 用户界面布局
- 总结
- 工程下载
引言
在本文中,我们将探讨如何使用Qt Quick构建一个简单的系统信息显示应用。该应用能够获取当前系统时间、IP地址以及基于IP的地理位置信息,展示了Qt Quick在网络请求和用户界面设计方面的能力。通过这个实例,可以了解如何在Qt Quick中处理网络请求、解析JSON数据以及创建响应式用户界面。
相关阅读
JavaScript网络请求(XMLHttpRequest):了解如何发起异步网络请求
- https://doc.qt.io/qt-6/qml-qtqml-xmlhttprequest.html
最终效果
代码详解
让我们分段分析Main.qml文件,详细理解其功能实现。
1. 基础框架与窗口设置
import QtQuick
import QtQuick.Controls
import QtQuick.LayoutsApplicationWindow {id: windowwidth: 450height: 400visible: truetitle: "System Info"// ... 后续代码 ...
}
这部分代码首先导入了必要的Qt模块:
QtQuick
:提供了QML的核心组件QtQuick.Controls
:提供了按钮等控件QtQuick.Layouts
:提供了布局管理器
然后创建了一个ApplicationWindow
作为应用的主窗口,设置了窗口的标识符、尺寸、可见性和标题。这是一个Qt Quick应用的标准开始方式。
2. IP定位功能实现
// 增加多种IP定位方法
function fetchLocationByIP() {locationText.text = "正在获取位置信息..."// 尝试不同的服务var services = [{name: "ip-api", url: "http://ip-api.com/json"},{name: "geoip", url: "https://freegeoip.app/json/"}]// 随机选择一个服务,避免总是使用同一个var service = services[Math.floor(Math.random() * services.length)]console.log("使用 " + service.name + " 获取位置")var request = new XMLHttpRequest()request.open("GET", service.url)request.onload = function() {if (request.status === 200) {try {var json = JSON.parse(request.responseText)var locationInfo = "位置信息 (基于IP,可能不准确):\n"// 根据不同服务解析不同字段if (service.name === "ipinfo") {if (json.country) locationInfo += "国家: " + json.country + "\n"if (json.region) locationInfo += "省份: " + json.region + "\n"if (json.city) locationInfo += "城市: " + json.city + "\n"if (json.postal) locationInfo += "邮编: " + json.postal + "\n"}else if (service.name === "ip-api") {if (json.country) locationInfo += "国家: " + json.country + "\n"if (json.regionName) locationInfo += "省份: " + json.regionName + "\n"if (json.city) locationInfo += "城市: " + json.city + "\n"if (json.district) locationInfo += "区县: " + json.district + "\n"if (json.zip) locationInfo += "邮编: " + json.zip + "\n"}else if (service.name === "geoip") {if (json.country_name) locationInfo += "国家: " + json.country_name + "\n"if (json.region_name) locationInfo += "省份: " + json.region_name + "\n"if (json.city) locationInfo += "城市: " + json.city + "\n"if (json.zip_code) locationInfo += "邮编: " + json.zip_code + "\n"}// 添加坐标信息var lat = service.name === "ipinfo" ? (json.loc ? json.loc.split(",")[0] : null) :(service.name === "ip-api" ? json.lat : json.latitude)var lon = service.name === "ipinfo" ? (json.loc ? json.loc.split(",")[1] : null) :(service.name === "ip-api" ? json.lon : json.longitude)if (lat && lon) {locationInfo += "坐标: " + lat + ", " + lon + "\n"}// 添加ISP信息,可能有助于判断位置if ((service.name === "ipinfo" && json.org) ||(service.name === "ip-api" && json.isp) ||(service.name === "geoip" && json.isp)) {locationInfo += "ISP: " + (json.org || json.isp) + "\n"}locationText.text = locationInfo} catch (error) {console.log("解析IP位置失败:", error)locationText.text = "位置: 无法解析位置数据"}} else {console.log("获取位置失败,状态码:", request.status)// 尝试下一个服务if (services.indexOf(service) < services.length - 1) {var nextIndex = (services.indexOf(service) + 1) % services.lengthservice = services[nextIndex]request.open("GET", service.url)request.send()} else {locationText.text = "位置: 所有服务均不可用"}}}request.onerror = function() {console.log("位置请求网络错误")locationText.text = "位置: 网络请求失败"}request.timeout = 5000request.send()
}
这个函数是应用的核心功能之一,用于通过IP地址获取用户的地理位置信息:
多服务源策略:
- 函数定义了两个不同的位置服务API,提高了获取成功率
- 使用随机选择策略,避免总是请求同一个服务
网络请求处理:
- 使用
XMLHttpRequest
发起异步GET请求 - 设置5秒的请求超时,避免长时间等待
响应处理:
- 成功响应(状态码200)时,解析JSON数据并提取位置信息
- 针对不同服务返回的不同JSON结构,使用条件语句进行适配处理
- 除了基本的国家、省份、城市信息外,还提取了坐标和ISP信息
错误处理机制:
- 使用try-catch捕获JSON解析错误
- 当一个服务失败时,自动尝试下一个服务
- 网络错误和超时都有相应的处理逻辑
3. IP获取功能
// IP获取功能
function fetchIP() {ipText.text = "正在获取IP..."var request = new XMLHttpRequest()var endpoints = ["https://api.ipify.org?format=json","https://ipinfo.io/json","http://httpbin.org/ip"]function tryNext() {if (endpoints.length === 0) {ipText.text = "IP: 所有服务不可用"return}var url = endpoints.shift()request.abort()request.open("GET", url)request.onload = function() {if (request.status === 200) {try {var json = JSON.parse(request.responseText)var ip = json.ip || json.originipText.text = ip ? "IP: " + ip : "IP: 获取成功但无IP"// 获取IP后立即获取位置信息fetchLocationByIP()} catch (error) {ipText.text = "IP: 解析响应失败"tryNext()}} else {tryNext()}}request.onerror = tryNextrequest.ontimeout = tryNextrequest.timeout = 3000request.send()}tryNext()
}
这个函数负责获取用户的IP地址,采用了更加灵活的多服务源策略:
多端点轮询机制:
- 定义了三个不同的IP获取服务端点
- 使用
endpoints.shift()
方法按顺序尝试每个端点,直到获取成功或全部失败
内部递归函数:
tryNext()
函数实现了服务轮询逻辑- 请求成功时解析IP地址,失败时自动尝试下一个服务
错误处理与超时设置:
- 为网络错误和超时都设置了
tryNext
回调,确保出错时会尝试下一个服务 - 设置了3秒的请求超时,比位置请求更短,因为IP请求通常更快
获取IP后的后续操作:
- 成功获取IP后,立即调用
fetchLocationByIP()
获取位置信息 - 这种链式调用确保了位置信息基于最新获取的IP
4. 时间更新与应用初始化
// 定时器更新当前时间
Timer {interval: 1000running: truerepeat: trueonTriggered: {timeText.text = "当前时间: " + Qt.formatDateTime(new Date(), "yyyy-MM-dd hh:mm:ss")}
}// 启动时获取IP
Component.onCompleted: {fetchIP()
}
这部分代码实现了两个重要功能:
实时时间更新:
- 使用Qt的
Timer
组件创建一个1秒间隔的定时器 - 每秒触发一次,更新显示的时间文本
- 通过
Qt.formatDateTime()
函数格式化日期和时间
应用初始化:
- 使用
Component.onCompleted
信号,在组件(这里是应用窗口)完成加载后立即触发 - 应用启动时自动调用
fetchIP()
函数,开始获取系统信息 - 这确保了用户打开应用后无需手动操作即可看到相关信息
5. 用户界面布局
ColumnLayout {anchors.fill: parentanchors.margins: 20spacing: 15Text {id: timeTextfont.pixelSize: 18Layout.alignment: Qt.AlignHCentertext: "正在获取时间..."}Text {id: ipTextfont.pixelSize: 18Layout.alignment: Qt.AlignHCentertext: "正在获取IP..."}Rectangle {Layout.fillWidth: trueLayout.fillHeight: trueborder.width: 1border.color: "#cccccc"radius: 5ScrollView {anchors.fill: parentanchors.margins: 10clip: trueText {id: locationTextfont.pixelSize: 16text: "正在获取位置信息..."width: parent.widthwrapMode: Text.WordWrap}}}Button {text: "刷新位置信息"Layout.alignment: Qt.AlignHCenteronClicked: fetchLocationByIP()}
}
这部分代码定义了应用的用户界面结构:
总体布局:
- 使用
ColumnLayout
创建垂直布局,使各元素从上到下排列 - 通过
anchors.fill: parent
使布局填充整个窗口
位置信息区域:
- 使用
Rectangle
创建一个带边框和圆角的容器 - 内嵌
ScrollView
实现内容滚动功能,适应不同长度的位置信息 - 位置文本使用
wrapMode: Text.WordWrap
实现自动换行
刷新按钮:
- 底部添加一个按钮,允许用户手动刷新位置信息
- 按钮点击时调用
fetchLocationByIP()
函数
总结
本文展示了一个使用Qt Quick实现的获取时间、IP、位置的示例。该示例虽然简单,但包含了许多实用的编程技巧,如多服务源的容错设计、不同API响应的适配处理等。这些设计使得应用在网络环境不稳定的情况下仍能提供可靠的服务。
工程下载
完整的项目代码可以从以下链接获取:Gitcode - 获取时间、IP、位置示例
相关文章:
在QML中获取当前时间、IP和位置(基于网络请求)
目录 引言相关阅读最终效果代码详解1. 基础框架与窗口设置2. IP定位功能实现3. IP获取功能4. 时间更新与应用初始化5. 用户界面布局 总结工程下载 引言 在本文中,我们将探讨如何使用Qt Quick构建一个简单的系统信息显示应用。该应用能够获取当前系统时间、IP地址以…...
Nuxt3中使用UnoCSS指南
Nuxt3中使用UnoCSS指南 UnoCSS是一个高度可定制的、原子化CSS引擎,可以轻松集成到Nuxt3项目中。下面介绍如何在Nuxt3中安装和配置UnoCSS。 安装步骤 安装UnoCSS的Nuxt模块: # 使用pnpm pnpm add -D unocss unocss/nuxt# 使用yarn yarn add -D unocss…...
【计算机网络】TCP的四种拥塞控制算法
TCP(传输控制协议)是互联网协议套件中用于在网络中两个主机之间提供可靠、有序和错误检测数据传输的协议。TCP使用拥塞控制机制来避免网络拥塞,确保网络资源的有效利用。以下是TCP中常见的四种拥塞控制算法: 慢启动(S…...
WebAssembly全栈革命:在Rust与JavaScript之间构建高性能桥梁
一、WASM的全栈渗透图谱 1. 性能临界点的突破 // Rust实现的斐波那契计算 #[wasm_bindgen] pub fn wasm_fib(n: i32) -> i32 {match n {0 > 0,1 > 1,_ > wasm_fib(n-1) wasm_fib(n-2)} }// JavaScript等效实现对比 console.time(js); jsFib(40); // 1024ms cons…...
深度理解linux系统—— 了解操作系统
一、冯诺依曼体系结构 现在我们常见的计算机(笔记本电脑等)和不常见的计算机(服务器)它们都满足冯诺依曼体系。 我们可以把计算机理解成一个个硬件组成的 输入设备:键盘、鼠标、摄像头、网卡、磁盘等输出设备…...
【fork初体验】
文章目录 Linux 实验:深入理解 fork 系统调用一、实验目的二、实验环境三、实验内容与步骤(一)打印进程的进程 ID 和父进程 ID1. 编写程序2. 编译与运行3. 运行结果 (二)使用 fork 系统调用创建进程并加入循环语句1. 编…...
区块链VS传统数据库:金融数据存储的“信任”与“效率”博弈
在金融行业数字化转型的浪潮中,数据存储技术选型已成为核心议题。区块链技术凭借其去中心化、不可篡改等特性强势崛起,而传统数据库(如关系型数据库MySQL、分布式数据库)凭借成熟生态和高效性能仍占据主导地位。如何在两者之间做出…...
Linux渗透测试
Linux渗透测试 比赛题库-Linux渗透测试 文章目录 Linux渗透测试比赛题库-Linux渗透测试 前言一、解题过程1.通过本地PC中渗透测试平台Kali对靶机场景进行系统服务及版本扫描渗透测试,并将该操作显示结果中Apache服务对应的版本信息字符串作为Flag值提交;…...
ORA-02069错误排查实录:从 Database Link 到 Global Names 的陷阱
文章目录 错误重现根因解决方案1.设置GLOBAL_NAMEStrue2.全部业务逻辑放在在远端执行 在日常的 Oracle 数据同步任务中,我们经常透过 Database Link(DBLink) 进行跨数据库查询与写入。某日,我们在执行一段 INSERT INTO … SELECT …...
【CF闯关练习】—— 1200分
🌏博客主页:PH_modest的博客主页 🚩当前专栏:cf闯关练习 💌其他专栏: 🔴每日一题 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮,缓…...
正则表达式三剑客之——grep和sed
目录 一.grep 1.1定义 1.2核心功能 1.3基本语法 1.4常用选项 二.sed 2.1 定义 2.2 工作原理 2.3 基本语法 2.3.1常用选项 2.3.2sed自身脚本语法 1. 基本组成 2. 地址 3. 命令 2.3.3 sed替换查找 1 基本语法 2.sed替换查找的实例 3.分组后向引用 4 变量调…...
i18n-ai-translate开源程序,可以使用DeepSeek等模型将您的 i18nJSON翻译成任何语言
一、软件介绍 文末提供程序和源码下载 i18n-ai-translate开源程序使用 DeepSeek等模型可以将您的 i18n JSON 翻译成任何语言。 无缝翻译本地化文件。支持嵌套翻译文件的目录。需要i18next样式的JSON 文件(文末一并提供下载)。 二、模式 CSV 模式 三个…...
关于Android Studio的Gradle各项配置
Gradle 构建概览 Android 应用通常使用 Gradle 构建系统构建。在深入了解如何配置 build 之前,我们先来探索 build 背后的概念,以便您全面了解系统。 什么是 build? 构建系统会将源代码转换为可执行应用。构建通常涉及多个工具,用…...
数据安全和合规性市场分析
一、什么是数据安全和合规性 在数据安全和合规性方面,存在着一系列重要的法律、法规和行业标准,这些规定了组织如何收集、存储、处理和保护个人数据及其他敏感信息。企业之所以要遵守这些规定,是出于多方面的考量,既有法律责任&a…...
venv环境基础指令以及常见问题汇总(持续更新)
常见指令 在 Python 原生虚拟环境(venv) 中,没有直接列出所有虚拟环境的命令(因为 venv 不像 Conda 那样有集中管理机制),但可以通过 文件操作 或 脚本 实现类似功能。以下是常用命令和技巧: &…...
思科路由器重分发(RIP动态路由+静态路由)
路由器重分发(RIP动态路由静态路由) 静态路由不能作翻译官 RIP需要宣告自己的ip;还需要帮静态路由也宣告一下开启端口并配置IP地址 RIP路由 Router>en Router#conf t Router(config)#int g0/0 Router(config-if)#no shutdown Router(c…...
产销协同的作用是什么?又如何对各部门发挥作用?
目录 一、产销协同的对象有哪些? 1. 客户需求 2. 市场趋势 3. 供应链伙伴 4. 企业战略目标 二、产销协同的作用是什么? 1. 提高客户满意度 2. 降低企业成本 3. 增强市场竞争力 4. 优化资源配置 三、产销协同对各部门怎么发挥作用?…...
19.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--当前项目拆分规划
随着业务规模的不断扩大和系统复杂度的提升,孢子记账系统需要进行微服务架构的转型。本文将详细规划从单体应用向微服务架构迁移的具体方案,包括功能模块分析、服务拆分、技术选型以及实施步骤等内容。通过合理的服务拆分和架构设计,未来我们…...
JFLAP SOFTWARE 编译原理用(自动机绘图)
csdn全是蛆虫,2mb的软件,都在那里搞收费,我就看不惯,我就放出来,那咋了!!! https://pan.baidu.com/s/1IuEfHScynjCCUF5ScF26KA 通过网盘分享的文件:JFLAP7.1.jar 链接: h…...
从 Vue 到 React:React 合成事件
目录 一、什么是 React 合成事件?二、处理流程React 事件系统的大致流程和 Vue 3 的区别 三、用法示例四、SyntheticEvent 的特点五、为什么 React 要统一事件到根节点?1.减少事件监听器数量2. 简化事件解绑逻辑3. 保证一致的行为 六、React 18 后事件系…...
react的fiber 用法
在 React 里,Fiber 是 React 16.x 及后续版本采用的协调算法,它把渲染工作分割成多个小任务,让 React 可以在渲染过程中暂停、恢复和复用任务,以此提升渲染性能与响应能力。在实际开发中,你无需直接操作 Fiber 节点&am…...
深度学习-学习笔记
文章目录 1、概述2、学习笔记2.1、pytorch 的环境配置 1、概述 本篇博客用来记录我学习深度学习的学习笔记 参考视频:PyTorch深度学习快速入门教程 PyTorch 是一个开源的机器学习框架,主要用于构建和训练深度学习模型。 2、学习笔记 2.1、pytorch 的环…...
[创业之路-390]:人力资源 - 社会性生命系统的解构与重构:人的角色嬗变与组织进化论
前言: 人、财、物、信息、机制、流程、制度、方法共同组合了一个持续的消耗资源、持续的价值创造、持续面临生存与发展、遗传与变异的社会性生命系统。 "人"是所有社会性生命系统最最基础性的要素,它弥漫在系统中多维立体空间的不同节点上&am…...
Redis常见面试题——List对象
当然可以!这里我帮你整理了一份【Redis中 List 结构】相关的高频面试题,并附上简明回答: 📚 Redis List 结构面试题(高频总结版) 1. Redis 中的 List 是什么?底层是什么实现的? 答&…...
案例速成GO操作redis,个人笔记
更多个人笔记:(仅供参考,非盈利) gitee: https://gitee.com/harryhack/it_note github: https://github.com/ZHLOVEYY/IT_note 安装redis客户端:go get github.com/redis/go-redis/v9 注意go …...
什么是WebSocket?NGINX如何支持WebSocket协议?
大家好,我是锋哥。今天分享关于【什么是WebSocket?NGINX如何支持WebSocket协议?】面试题。希望对大家有帮助; 什么是WebSocket?NGINX如何支持WebSocket协议? 1000道 互联网大厂Java工程师 精选面试题-Java…...
ssm驾校预约管理系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
摘要 伴随着我国社会的发展,人民生活质量日益提高。在人们出行方式上的体现就是,价格较为昂贵的代步工具——汽车,它的拥有率在我国越来越高了。而汽车的行驶速度很快,并且随着汽车拥有率的增加,城市中行驶和停靠的车…...
babel核心知识点
Babel 是一个 JavaScript 编译器,主要用于将 ECMAScript 2015 版本的代码转换为向后兼容的 JavaScript 代码,以便在旧版本的浏览器或环境中运行。以下是 Babel 的核心知识点: 1. 基本概念 编译器:Babel 本质上是一个编译器&…...
学习笔记(算法学习+Maven)
单调队列优化多重背包 #include <bits/stdc.h> using namespace std; const int M 2010; const int N 20010; int q[N]; int hh 0, tt -1; int f[N]; int g[N]; int v[M], w[M], s[M]; int n, m; int main() { cin >> n >> m; for (int i 1; …...
买币永续合约成全球交易热点,XBIT去中心化交易所平台显著提升市场流动性
在全球加密货币市场日益扩大的背景下,买币永续合约正展现出惊人的增长势头。虽然比特币自2021年黄金时期以来整体兴趣有所减弱,但永续合约市场表现亮眼,专业和机构交易者正从传统日历期货转向这一领域,使得永续合约占据了约66%的未…...
详解 `from datasets import load_dataset`:数据格式、公开数据集与自定义数据集实战指南
在自然语言处理(NLP)和机器学习领域,Hugging Face 的 datasets 库凭借其高效的数据加载和预处理能力成为开发者必备工具。本文通过代码示例详解 load_dataset 的核心用法,涵盖数据格式解析、公开数据集调用和自定义数据集构建。 一、数据格式解析与加载示例 datasets 库支…...
Eclipse 插件开发 1
Eclipse 插件开发 1 1 创建 Eclipse 插件2 特点对比表3 总结对比表 Eclipse 是一个功能强大的集成开发环境(IDE),最初为 Java 开发设计,但现在已经支持多种语言和平台。它的核心优势在于高度可扩展的插件架构,使开发者能够定制开发环境以满足…...
单链表专题(1)
1.什么是链表? 链表是结构体变量与结构体变量连接在一起 2.动态创建一个链表 动态内存申请模块化设计 1.创建链表(创建一个表头表示整个链表) 2.创建结点 3.插入结点 4.删除结点 5.打印遍历链表(测试) 3.创建链…...
[贪心_8] 跳跃游戏 | 单调递增的数字 | 坏了的计算器
目录 1.跳跃游戏 题解 2.单调递增的数字 证明 3.坏了的计算器 题解 解法一:正向推导 解法二:正难则反 1.跳跃游戏 链接: 55. 跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你…...
Python基于Django的全国二手房可视化分析系统【附源码】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
Spring Boot 升级指南(2.x → 3.x)
🚀 Spring Boot 升级指南(2.x → 3.x) 🔢 1️⃣ 必读文档 📘 当您需要从 Spring Boot 2.x 升级时: • 官方迁移指南 → https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-…...
基于亚马逊云科技构建音频转文本无服务器应用程序
Amazon Transcribe是一项基于机器学习模型自动将语音转换为文本的服务。它提供了多种可以提高文本转录准确性的功能,例如语言自定义、内容过滤、多通道音频分析和说话人语音分割。Amazon Transcribe 可用作独立的转录服务,也可以集成到应用程序中提供语音…...
io_uring概述:现代 Linux 异步 IO 的新范式
一、引言 在 Linux 系统中,I/O 性能一直是高性能服务器、数据库、存储系统的关键瓶颈。传统的 I/O 接口(如 read、write、poll、epoll)已经难以满足现代高吞吐低延迟场景的需求。io_uring 的诞生,正是为了解决这些传统 I/O 模型中…...
定制一款国密浏览器(12):分析SM2签名算法的实现
SM2 是一种非对称加密算法,除了用来进行加密解密外,主要作用还用作数字签名。数字签名是私钥签名,公钥用来验签。由于私钥是不公开的,所以私钥签名还可以防抵赖。 一般的签名流程如下: 发送者对消息计算摘要值。发送者用私钥对摘要值进行签名得到签名值。发送者将原始消息…...
SSE协议
目录 SSE协议协议实现传输格式data 字段id 字段event 字段retry 字段 前后端实现使用案例FastAPI SSE-STARLETTE 模拟大模型推理流🖥 代码:FastAPI SSE-STARLETTE 模拟大模型推理流 SSE协议 SSE,全称是 Server-Sent Events,是一…...
精益数据分析(25/126):关键指标驱动业务发展
精益数据分析(25/126):关键指标驱动业务发展 在创业和数据分析的道路上,我们都在不断探索如何利用数据实现业务的增长与优化。今天,让我们一起深入学习《精益数据分析》中的关键知识点,通过实际案例来理解…...
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
前言 Spring AI Alibaba 开源项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。 项目地址 gitcode平台:ht…...
git 工具
Git教程 Git Bash详细教程 Git教程 Git Bash详细教程-CSDN博客 Download – TortoiseGit – Windows Shell Interface to Git...
利用【指针引用】对【非空单循环链表】进行删除操作
【非空单循环链表】是链式存储结构的其中一种,下面是各个词汇的意思: 先说【单】的意思: 这里指的是【单循环】的,另外在别的地方你会碰到一些不一样的循环链表,比如说是【多重链】的。 单循环 【单循环链表】常在表的…...
2025.4.26_STM32_SPI
1.SPI简介 2.硬件电路 所有SPI设备的SCK(时钟)、MOSI(主机输出从机输入)、MISO(主机输入从机输出)分别连在一起。SCK线只能被主机控制,和I2C相同。 主机另外引出多条SS控制线,分别接到各从机的SS引脚 (SS不用的时候为高电平,当主机需要选中某…...
基于OpenMV+STM32+OLED与YOLOv11+PaddleOCR的嵌入式车牌识别系统开发笔记
基于OpenMV、STM32与OLED的嵌入式车牌识别系统开发笔记 基于OpenMV、STM32与OLED的嵌入式车牌识别系统开发笔记系统架构全景 一、实物演示二、OpenMV端设计要点1. 硬件配置优化2. 智能帧率控制算法3. 数据传输协议设计 三、PyTorch后端核心实现:YOLOv11与PaddleOCR的…...
当JIT遇见K8s
目录 一、技术融合背景:从静态架构到动态生态的范式重构 1.1 动态编译技术的三次进化浪潮 1.2 容器编排系统的动态特性解剖 弹性伸缩的数学建模 服务质量(QoS)的编译场景适配 硬件拓扑感知的编译优化 二、关键技术挑战与突破性解决方案…...
单片机-89C51部分:4、固件烧录
飞书文档https://x509p6c8to.feishu.cn/wiki/M00gwFX3WilLe0kiAmBcPBUsnLc 接线 通过USB线把开发板和电脑连接起来,如果电脑没有安装过USB转串口驱动,在设备管理器中就找不到COM口,而且会有驱动提示叹号,我们可以下载下方驱动安…...
7.13 GitHub Sentinel全链路测试实战:自动化框架+零误差传输,QPS提升6倍!
GitHub Sentinel全链路测试实战:自动化框架+零误差传输,QPS提升6倍 GitHub Sentinel Agent 用户界面设计与实现 关键词:前后端联调测试、数据传输验证、接口稳定性测试、命令行工具测试、自动化测试框架 测试前后端功能与数据传输稳定性 1. 全链路测试策略设计 采用分层…...
stm32之EXIT外部中断详解
目录 1.引入: STM32F1031.1 中断路径上的3个部件1.2 STM32F103的GPIO中断1.1.1 GPIO控制器 -- AFIO1.1.2 EXTI1.1.3 NVIC1.1.4 CPU1. PRIMASK2. FAULTMASK3. BASEPRI 1.3 中断执行流程 2.旋转编码器介绍3.实验3.1 EXIT3.1.1 结构体3.1.2 函数 3.2 NVIC3.2.1 结构体3.2.2 函数 3…...