[GN] sigrokdecode 模块学习指南 --- 准备阶段
系列文章目录
`
文章目录
- 系列文章目录
- 前言
- 指南
- libsigrokdecode 学习
- 一、构建环境
- 安装libsigrokdecode
- 安装 sigrok-cli(命令行工具)
- 安装 PulseView(图形界面)
- 关联 libsigrokdecode
- 完整验证
- 参数解释
- 二、BUG解决
- 1. 确保编译时启用了 Python 绑定
- 2. 检查 Python 绑定的实际安装路径
- 3. 手动指定 Python 包安装路径
- 4. 设置 `PYTHONPATH` 环境变量
- 5. 检查 `configure` 输出日志
- 三、libsigrokdecode学习步骤
- 第一阶段:基础准备
- 1. 理解核心概念
- 2. 必备知识
- 3. 工具准备
- 第二阶段:源码结构解析
- 1. 代码仓库目录
- 2. 核心模块交互
- 3. 项目的配置文件介绍
- 第三阶段:从简单解码器入手(以UART为例)
- 1. 文件结构
- 2. 关键代码解析
- 3. 学习重点
- 第四阶段:深入C层源码
- 1. 解码器注册流程(src/decoder.c)
- 2. 数据流处理(src/session.c)
- 4. Python与C交互(python/sigrokdecode.c)
- 第五阶段:实践与调试
- 1. 编写简单解码器
- 2. 调试技巧
- 3. 测试数据生成
libsigrokdecode(有时简称“srd”)是一个使用C语言编写的共享库,它提供了用于运行sigrok协议解码器的基本API。该库是开源社区为创建一个便携式、跨平台的自由/开源信号分析软件套件的一部分,旨在支持逻辑分析仪、示波器、万用表等多种设备类型。协议解码器自身是以Python编写的,并集成在库中,确保了其作为整体库的一部分遵循GPLv3或更高版本的许可。
前言
libsigrokdecode广泛应用于电子工程和嵌入式开发领域,通过它,开发者可以解析复杂的数据流,比如解读I2C、SPI通信等。最佳实践包括:
- 使用libsigrokdecode结合sigrok-cli或图形界面工具如PulseView来分析硬件通信。
- 在调试嵌入式系统时,利用预定义的解码器来快速验证外设通讯协议。
- 开发自定义解码器时,遵循项目提供的Python接口文档,保证解码器的可维护性和兼容性。
指南
libsigrokdecode是更广泛的sigrok项目的一部分,该项目还包括信号捕获前端(如PulseView)和其他辅助工具。在ecosystem中,典型的关联项目包括:
- PulseView: 是一个图形用户界面,能够显示来自硬件设备的信号数据,并且与libsigrokdecode紧密合作,提供可视化解码。
- libsigrok: 主库,用于采集和处理信号数据,libsigrokdecode作为其重要的扩展提供协议分析功能。
- 各种硬件驱动: 支持大量硬件设备,让libsigrokdecode的解码能力得以在不同设备上应用。
libsigrokdecode 学习
-
sigrok 子项目的构建要求,并包含从源代码构建它们的特定于作系统的说明:https://sigrok.org/wiki/Building
-
您可以从 sigrok.org 下载目录下载以下子项目的最新发布的 tarball:https://sigrok.org/wiki/Downloads#Binaries_and_distribution_packages
-
libsigrokdecode 协议解码器 (PD) 的工作原理: https://sigrok.org/wiki/Protocol_decoder_API
-
libsigrokdecode 协议解码器 (PD) 的编写:https://sigrok.org/wiki/Protocol_decoder_HOWTO
-
协议解码器 API/查询:https://sigrok.org/wiki/Protocol_decoder_API/Queries
一、构建环境
安装libsigrokdecode
- 安装依赖
# Ubuntu/Debian
sudo apt update
sudo apt install -y \git \build-essential \autoconf automake libtool \python3-dev \libglib2.0-dev \check\ # 单元测试工具# 确保 Python 头文件存在(关键!)
ls /usr/include/python3.*/Python.h # 应返回有效路径
- 获取源码
# 推荐通过 HTTPS 克隆(避免 git:// 协议问题)
git clone https://github.com/sigrokproject/libsigrokdecode.git
cd libsigrokdecode
- 构建脚本
# 若缺少 autogen.sh 权限
chmod +x autogen.sh# 生成 configure 脚本
./autogen.sh
- 配置编译选项
# 标准配置(默认安装到 /usr/local)
./configure# 若需指定 Python 版本(例如 Python 3.8)
PYTHON=python3.8 ./configure
- 编译与安装
make -j$(nproc) # 并行编译(加速)
sudo make install # 安装到系统目录
sudo ldconfig # 更新动态库缓存
- 验证安装
# 检查版本信息
sigrok-cli --version# 列出所有解码器(需至少安装一个)
sigrok-cli --show | grep decoders
安装 sigrok-cli(命令行工具)
- 安装依赖
# Ubuntu/Debian
sudo apt install build-essential git autoconf automake libtool \pkg-config libglib2.0-dev libzip-dev libcheck-dev
- 获取源码并编译
git clone https://github.com/sigrokproject/sigrok-cli.git
cd sigrok-cli
./autogen.sh
./configure
make -j$(nproc)
sudo make install
sudo ldconfig
- 验证安装
sigrok-cli --version
# 正常输出示例:sigrok-cli 0.7.2
安装 PulseView(图形界面)
- 安装依赖
# Ubuntu/Debian
sudo apt install cmake git qtbase5-dev qttools5-dev \libboost-dev libboost-system-dev libboost-filesystem-dev \libboost-thread-dev libqt5svg5-dev libusb-1.0-0-dev
- 获取源码并编译
git clone --depth=1 https://github.com/sigrokproject/pulseview.git
cd pulseview
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr/local ..
make -j$(nproc)
sudo make install
sudo ldconfig
- 验证安装
pulseview --version
# 正常输出示例:PulseView 0.4.2
关联 libsigrokdecode
- 确保动态库路径正确
# 检查 libsigrokdecode 是否在链接器路径中
sudo ldconfig -p | grep libsigrokdecode# 若未找到,手动添加路径(假设安装到 /usr/local/lib)
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/sigrok.conf
sudo ldconfig
- 配置 Python 路径(关键步骤!)
# 检查 Python 绑定路径(假设 Python 3.8)
ls /usr/local/lib/python3.8/dist-packages/sigrokdecode*# 若路径存在但无法导入,设置 PYTHONPATH
echo "export PYTHONPATH=/usr/local/lib/python3.8/dist-packages:\$PYTHONPATH" >> ~/.bashrc
source ~/.bashrc
完整验证
- 测试硬件检测
sigrok-cli --scan
# 正常输出示例(需连接支持设备):
# The following devices were found:
# demo - Demo device with 8 channels
- 运行完整解码流程
# 生成测试信号(假设已安装 libsigrok)
sigrok-cli --driver=demo --samples=1000 --output=test.sr# 使用 PulseView 查看
pulseview test.sr
sigrok-cli --driver=demo --config samplerate=1M \--channels=D0 -P uart:rx=D0,baudrate=9600 \--output-format=text --samples 1000
参数解释
参数 | 说明 |
---|---|
--driver=demo | 使用虚拟 Demo 设备 |
--config samplerate=1M | 设置采样率为 1MHz(大写 M ) |
--channels=D0 | 仅启用数字通道 D0 |
-P uart:rx=D0,baudrate=9600 | 运行 UART 解码器,指定 RX 引脚为 D0,波特率 9600 |
--output-format=text | 输出格式为文本 |
--samples 1000 | 采集 1000 个样本 |
二、BUG解决
你遇到的 ls: cannot access ... No such file or directory
错误表明以下可能性:
libsigrokdecode
的 Python 绑定未正确安装。- Python 包安装路径不符合预期(如未安装到
/usr/local/lib/...
)。 - 编译时未启用 Python 绑定。
1. 确保编译时启用了 Python 绑定
在编译 libsigrokdecode
时,必须启用 Python 支持并正确安装 Python 绑定。
cd ~/Desktop/libsigrokdecode# 清理旧编译文件
make distclean
git clean -fdx# 配置时强制指定 Python 路径
./autogen.sh
./configure PYTHON=/usr/bin/python3# 编译并安装(需要 sudo 权限)
make -j$(nproc)
sudo make install
2. 检查 Python 绑定的实际安装路径
默认情况下,Python 绑定可能安装到系统目录 /usr/lib/python3/dist-packages/
或 /usr/local/lib/python3.8/site-packages/
,而非 dist-packages
。
# 搜索所有可能的安装路径
sudo find / -name "sigrokdecode*" 2>/dev/null# 检查常见路径
ls /usr/lib/python3/dist-packages/sigrokdecode*
ls /usr/local/lib/python3.8/site-packages/sigrokdecode*
3. 手动指定 Python 包安装路径
如果绑定未安装到预期路径,可在配置时指定 --prefix
:
# 指定安装到 /usr/local
./configure --prefix=/usr/local PYTHON=/usr/bin/python3# 重新编译并安装
make -j$(nproc)
sudo make install# 验证安装路径
ls /usr/local/lib/python3.8/site-packages/sigrokdecode*
4. 设置 PYTHONPATH
环境变量
如果 Python 绑定安装到了非标准路径,需手动添加路径到 PYTHONPATH
:
# 假设绑定安装到了 /usr/local/lib/python3.8/site-packages
export PYTHONPATH="/usr/local/lib/python3.8/site-packages:$PYTHONPATH"# 验证 Python 能否导入模块
python3 -c "import sigrokdecode; print(sigrokdecode)"
5. 检查 configure
输出日志
确保配置阶段检测到了 Python 绑定支持:
# 查看配置日志中 Python 相关条目
cat config.log | grep -i "python"# 期望输出类似:
# checking for Python... /usr/bin/python3
# checking Python headers... /usr/include/python3.8
# checking Python library... yes (shared)
三、libsigrokdecode学习步骤
第一阶段:基础准备
1. 理解核心概念
- 协议解码:将原始信号(如数字电平)解析为协议帧(如UART的起始位、数据位、停止位)。
- 采样数据流:硬件采集的时序数据(如逻辑分析仪捕获的二进制信号)。
- 注解(Annotation):解码过程中添加的元数据(如“数据字节: 0x55”)。
2. 必备知识
- Python基础:类、装饰器、列表操作(解码器用Python编写)。
- C基础:指针、结构体、回调函数(核心库用C实现)。
- 信号协议:UART/SPI/I2C等常见协议的时序逻辑(推荐先学习UART)。
3. 工具准备
- 调试工具:
- GDB(调试C代码):
gdb --args python3 your_script.py
- PDB(调试Python解码器):
python3 -m pdb your_decoder.py
- GDB(调试C代码):
- 可视化工具:PulseView(直观查看解码结果)。
第二阶段:源码结构解析
1. 代码仓库目录
libsigrokdecode/
├── contrib/
├── decoders/
├── irmp/
├── m4/
├── tests/
├── tools/
├── .gitattributes
├── .gitignore
├── AUTHORS
├── COPYING
├── Doxyfile
├── HACKING
├── Makefile.am
├── NEWS
├── README
├── autogen.sh
├── configure.ac
├── decoder.c
├── error.c
├── exception.c
├── instance.c
├── libsigrokdecode-internal.h
├── libsigrokdecode.h
├── libsigrokdecode.pc.in
├── log.c
├── module_sigrokdecode.c
├── session.c
├── srd.c
├── type_decoder.c
├── util.c
├── version.c
├── version.h.in
- contrib/: 包含一些贡献者的代码和工具。
- decoders/: 包含各种协议解码器的实现。
- irmp/: 包含与红外协议相关的代码。
- m4/: 包含用于自动配置的 m4 宏文件。
- tests/: 包含项目的单元测试代码。
- tools/: 包含一些实用工具和脚本。
- .gitattributes: Git 属性配置文件。
- .gitignore: Git 忽略文件配置。
- AUTHORS: 项目作者列表。
- COPYING: 项目许可证文件。
- Doxyfile: Doxygen 配置文件,用于生成 API 文档。
- HACKING: 项目开发指南。
- Makefile.am: Automake 配置文件。
- NEWS: 项目更新日志。
- README: 项目介绍和使用说明。
- autogen.sh: 自动生成配置脚本。
- configure.ac: Autoconf 配置文件。
- decoder.c: 解码器核心代码。
- error.c: 错误处理代码。
- exception.c: 异常处理代码。
- instance.c: 实例管理代码。
- libsigrokdecode-internal.h: 内部头文件。
- libsigrokdecode.h: 公共头文件。
- libsigrokdecode.pc.in: pkg-config 配置文件模板。
- log.c: 日志记录代码。
- module_sigrokdecode.c: 模块管理代码。
- session.c: 会话管理代码。
- srd.c: 核心功能代码。
- type_decoder.c: 解码器类型管理代码。
- util.c: 实用工具代码。
- version.c: 版本管理代码。
- version.h.in: 版本头文件模板。
2. 核心模块交互
libsigrokdecode 项目的启动文件主要是 decoder.c
。这个文件包含了项目的主要逻辑和功能实现。启动时,项目会加载并初始化解码器模块,并根据配置文件进行相应的设置。
- 初始化:
lib.c
初始化库并注册全局解码器。 - 会话管理:
session.c
创建解码会话,管理输入数据流。 - 解码器加载:
decoder.c
扫描并加载decoders/
目录下的Python解码器。 - 数据处理:Python解码器通过
decode()
方法逐层解析数据。
3. 项目的配置文件介绍
libsigrokdecode 项目的配置文件主要包括以下几个:
- configure.ac: 用于生成
configure
脚本的 Autoconf 配置文件。 - Makefile.am: 用于生成
Makefile
的 Automake 配置文件。 - Doxyfile: 用于生成 API 文档的 Doxygen 配置文件。
- libsigrokdecode.pc.in: 用于生成 pkg-config 文件的模板。
第三阶段:从简单解码器入手(以UART为例)
1. 文件结构
decoders/uart/
├── pd.py # 解码器主逻辑
└── __init__.py # 解码器元数据
2. 关键代码解析
# pd.py
class Decoder(srd.Decoder):api_version = 3id = 'uart'name = 'UART'# 定义输入输出类型inputs = ['logic']outputs = ['uart']# 定义可配置参数(如波特率)options = ({'id': 'baudrate', 'desc': 'Baud rate', 'default': 115200},)def __init__(self):self.out_python = self.register(srd.OUTPUT_PYTHON)def start(self):self.samplerate = self.get_samplerate() # 获取采样率self.bit_width = self.samplerate // self.options['baudrate']def decode(self, startsample, endsample, data):# 核心解码逻辑:检测起始位 → 读取数据位 → 验证停止位for bit in data:if self.state == 'WAIT_START':if bit == 0: # 检测到起始位self.ss = startsampleself.state = 'READ_DATA'elif self.state == 'READ_DATA':self.data_bits.append(bit)if len(self.data_bits) == 8:byte = sum(bit << i for i, bit in enumerate(self.data_bits))self.put(self.ss, endsample, self.out_python, ['DATA', byte])self.state = 'WAIT_STOP'# ...(完整逻辑参考源码)
3. 学习重点
-
状态机设计:
decode()
方法中的self.state
管理解码流程。 -
数据传递:
self.put()
将解码结果传递给下一层或输出。 -
采样率计算:
start()
中根据波特率计算每个位的采样点数。
第四阶段:深入C层源码
1. 解码器注册流程(src/decoder.c)
// 加载Python解码器
SRD_PRIV int srd_decoder_load(const char *decoder_id) {// 1. 搜索 decoders/ 目录// 2. 动态加载Python模块// 3. 验证解码器元数据(api_version, id等)// 4. 注册到全局列表 decoder_list
}
2. 数据流处理(src/session.c)
// 核心处理循环
void srd_session_run(struct srd_session *sess) {while (1) {// 从硬件或文件读取数据// 调用解码器的 decode() 方法// 传递数据到下一层解码器(堆叠式解码)}
}
4. Python与C交互(python/sigrokdecode.c)
- C调用Python:通过
PyObject_CallMethod
执行解码器的decode()
。 - 数据转换:C中的
struct srd_proto_data
转换为Python中的元组。
第五阶段:实践与调试
1. 编写简单解码器
# mydecoder/pd.py
class Decoder(srd.Decoder):api_version = 3id = 'my_protocol'name = 'My Protocol'def __init__(self):self.out_ann = self.register(srd.OUTPUT_ANN)def decode(self, startsample, endsample, data):self.put(startsample, endsample, self.out_ann, ['Hello World'])
2. 调试技巧
-
日志输出:
import logging logging.basicConfig(level=logging.DEBUG)
-
断点调试:
# C层断点 gdb --args python3 -m sigrokdecode.cli -i input.sr -P my_protocol # Python层断点 python3 -m pdb -m sigrokdecode.cli -i input.sr -P my_protocol
3. 测试数据生成
使用 sigrok-cli
生成测试信号:
sigrok-cli --generate uart:rx=0:baudrate=9600 -o test.sr
相关文章:
[GN] sigrokdecode 模块学习指南 --- 准备阶段
系列文章目录 文章目录 系列文章目录前言指南libsigrokdecode 学习一、构建环境安装libsigrokdecode安装 sigrok-cli(命令行工具)安装 PulseView(图形界面)关联 libsigrokdecode完整验证参数解释 二、BUG解决1. 确保编译时启用了 …...
【力扣hot100题】(056)电话号码的字母组合
依旧是很经典的回溯。 记得当初做这题想了半天电话号码怎么存储,用哈希表就可以解决。 class Solution { public:vector<string> result;string digits;int loc0;unordered_map<char,string> dictionary{{2,"abc"},{3,"def"},{4,…...
kotlin,数字滚动选择
用国内的通义灵码和codegeex都没有弄出来,最后只得用墙外的chatgpt才弄出一个满意的。kotlin真的有点难,好在有AI,让学习没这难了。 package com.example.mynumsetimport android.os.Bundle import androidx.activity.ComponentActivity imp…...
Flask学习笔记 - 数据库
Flask 数据库操作 Flask 提供了多种方式来与数据库进行交互,包括直接使用 SQL 和利用 ORM(对象关系映射)工具,如 SQLAlchemy。 使用SQLAlchemy创建和管理数据库:使用 db.create_all() 创建表。CRUD 操作:…...
学透Spring Boot — 015. 自废武功——关闭自动配置
这是我的《学透Spring Boot》专栏的第15篇文章,了解更多请移步我的专栏:CSDN Postnull的专栏《学透Spring Boot》 目录 遇到的问题 分析日志 自动配置的过程 解决报错 方法1:添加数据库配置 方法2:关闭JPA自动配置 总结 遇…...
DeepSeek本地部署(Ollama)
1. Ollama 安装 Ollama 官网地址: https://ollama.com/安装包网盘地址: https://pan.baidu.com 2. Deepseek 部署 根据自己电脑配置和应用需求选择不同模型,配置不足会导致运行时候卡顿。 版本安装指令模型大小硬盘(存储)显卡…...
Python如何将已经安装的包导出为 .whl 文件以便离线使用
1、确认已安装的依赖包 pip list --formatfreeze > requirements.txt2、下载但不安装依赖包 # 单个包使用 pip download 依赖包名称 -d ./offline_packages# 多个包使用 pip download -r requirements.txt -d ./offline_packages使用离线包的时候,还需要确保在与…...
TypeScript学习第十六篇 - interface和type的区别?
在 TypeScript 中,interface 和 type 都用于定义自定义类型,但它们有一些关键区别: 1. 主要区别 1.1. 语法差异 interface 使用 interface 关键字。 interface Person {name: string;age: number; } type 使用 type 关键字。 type Pers…...
vue-axios跨域问题
vue-axios跨域问题 跨域原因现象前端解决方案 跨域原因 跨域:浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。 在前后端分离的模式下,前后端的域名是不一致的,此时就会发生跨域…...
PyCharm中虚拟环境.venv搭建详解
PyCharm中创建、配置和管理虚拟环境,可以确保每个项目都有独立的依赖项,从而提高开发效率和项目的可移植性。接下来介绍一下pycharm虚拟环境的目录介绍以及搭建和管理办法。 虚拟环境目录是PyCharm中用于存储虚拟环境相关文件和配置的文件夹。PyCharm虚…...
小刚说C语言刷题——第16讲 switch语句
在日常生活中,我们经常会遇到多分支的情况。当分支较多时,我们可以用嵌套的if-else语句。但是这样会让结构显得混乱。这个时候我们可以考虑用switch语句。 1.语法格式 switch (表达式) { case 常量表达式1: 语句1; break; case 常量表达式…...
关联容器-模板类pair数对
关联容器 关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。 关联容器支持高效的关键字查找和访问。 两个主要的关联容器(associative-container),set和map。 set 中每个元素只包…...
Linux:基础IO---inode
文章目录 1. inode1.1 未被打开的文件1.2 认识硬件1.3 对磁盘进行逻辑抽象(解构)1.4 文件系统 序:在上一个章节缓冲区中,我通过将几个实例进行对比,引出了C语言级别即用户级别的缓冲区的概念,将用户级缓冲与…...
蓝桥杯_LITS游戏 俄罗斯方块 模拟 暴力 搜索 DFS 剪纸 枚举
从格子图的第一个格子开始,依次尝试放置 L、I、T、S 形状。在放置每个形状时,检查当前位置是否合法(是否在格子图范围内且没有被其他形状占据)。如果合法,我们就标记当前位置为已占据,并递归地尝试放置下一…...
蓝桥杯基础算法-字符串与集合
对集合的考察集中在集合的特性和功能。 set-唯一性 list-有序性 集合元素的个数 思路分析:set的唯一性,取出重复的子串 eg: 下标0截取的范围:【0,最大下标】 下标1截取的范围:【1,最大下标…...
ChatGPT 4:解锁AI文案、绘画与视频创作新纪元
文章目录 一、ChatGPT 4的技术革新二、AI文案创作:精准生成与个性化定制三、AI绘画艺术:从文字到图像的神奇转化四、AI视频制作:自动化剪辑与创意实现五、知识库与ChatGPT 4的深度融合六、全新的变革和机遇《ChatGPT 4 应用详解:A…...
【C++】多态详解
文章目录 一、多态的概念二、多态的效果及实现1.多态的效果2.实现多态有两个必须条件3.虚函数4.虚函数的重写/覆盖5.多态场景下两个很坑的选择题6.重载/重写/隐藏的对比 三、虚函数重写的一些其他知识1.协变(了解)2.析构函数的重写3.检测是否重写&#x…...
Python与CATIA集成实现拓扑面颜色映射——图像驱动自动化设计实战
一、技术背景与需求场景 在汽车/航空等高端制造领域,常需将二维图像的颜色特征映射到三维模型的拓扑表面。传统手动操作耗时且易出错,本文通过Python-CATIA集成技术实现像素级颜色自动映射,可应用于: 涂装方案可视化验证材料纹理…...
Qt中的多种输出方式,信号与槽的基本使用
完成Hello World可以通过很多控件实现 如采用编辑框来完成hello world 编辑框分为单行编辑框----QLineEdit 和多行编辑框---QTextEdit 采用单行编辑框,创建项目后,展开forms文件夹,双击ui文件进入 qt designer设计页面 找到line edit 拖到页…...
C语言查漏补缺:基础篇
1.原理 C语言是一门编译型计算机语言,要编写C代码,C源代码文本文件本身无法直接执行,必须通过编译器翻译和链接器的链接,生成二进制的可执行文件,然后才能执行。这里的二进制的可执行文件就是我们最终要形成的可执行程…...
【ElasticSearch】
目录 1. 基本知识1.1 restful语法1.2 内部基于_version乐观锁控制1.3 restful 批量(bulk)增删改 2. 分布式及容错机制2.1 ElasticSearch分布式基础1 ES分布式机制2 rebalance3 master节点4 节点对等 2.2 分片shard、副本replica机制2.3 es容错机制 3. 文…...
投资策略分析:十年年化32.2%,夏普比1.31的动量斜率策略(策略源码+数据下载)
原创内容第848篇,专注智能量化投资、个人成长与财富自由。 竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。 回首向来萧瑟处,归去,也无风雨也无晴。 苏轼被贬黄州期间,借雨中徐行的意象,表达对人生荣辱得…...
httpx模块的使用
在使用requests模块发起请求时,报以下错误,表示服务器有可能使用的是http2.0协议版本,导致requests无法爬取。 此时就可以使用httpx模块爬取。 先下载httpx模块: pip install httpx[http2]然后用httpx发起请求: impo…...
【文献研究】含硼钢中BN表面偏析对可镀性的影响
《B 添加钢的溶融 Zn めっき性に及ぼす BN 表面析出の影響》由JFE公司田原大輔等人撰写。研究聚焦 B 添加钢在低露点退火时 BN 形成对镀锌性的影响,对汽车用高强度钢镀锌工艺优化意义重大。通过多组对比实验,结合多种分析手段,明确了相关因素…...
Logo语言的区块链
Logo语言的区块链探索 引言 随着科技的快速发展,区块链作为一种颠覆传统的分布式账本技术,正逐渐被许多行业所接受和应用。其核心特性在于去中心化、透明性、不可篡改性和安全性,这些特性使得区块链在金融、供应链、医疗、版权保护等领域显…...
3D Gaussian Splatting as MCMC 与gsplat中的应用实现
3D高斯泼溅(3D Gaussian splatting)自2023年提出以后,相关研究paper井喷式增长,尽管出现了许多改进版本,但依旧面临着诸多挑战,例如实现照片级真实感、应对高存储需求,而 “悬浮的高斯核” 问题就是其中之一。浮动高斯核通常由输入图像中的曝光或颜色不一致引发,也可能…...
车载ECU底软测试:方法与技术的深度解析
文章目录 引言车载 ECU 底软概述测试目标测试范围功能验证性能与实时性安全性与可靠性兼容性测试测试工具与技术方案分层测试方法与技术实现1. 单元测试(Unit Testing)2. 集成测试(Integration Testing)3. 系统测试(System Testing)4. 安全认证测试(Certification Testi…...
机器视觉3D中激光偏镜的优点
机器视觉的3D应用中,激光偏镜(如偏振片、波片、偏振分束器等)通过其独特的偏振控制能力,显著提升了系统的测量精度、抗干扰能力和适应性。以下是其核心优点: 1. 提升3D成像精度 抑制环境光干扰:偏振片可滤除非偏振的环境杂光(如日光、室内照明),仅保留激光偏振信号,大…...
25.6 多模态AI类型系统实战:日均10万请求下的99.99%可靠性保障与10倍性能提升
多模态AI类型系统实战:日均10万请求下的99.99%可靠性保障与10倍性能提升 关键词:类型标注实践, Pydantic 数据建模, 多模态数据处理, CogView 集成, CharGLM 对话引擎 1. 类型系统在 AI 应用中的核心价值 在复杂 Agent 系统中,类型标注是保障代码健壮性的第一道防线。当我…...
单链表的实现 | 附学生信息管理系统的实现
目录 1.前言: 2.单链表的相关概念: 2.1定义: 2.2形式: 2.3特点: 3.常见功能及代码 : 3.1创建节点: 3.2头插: 3.3尾插: 3.4头删: 3.5尾删: 3.6插入…...
【CMake】《CMake构建实战:项目开发卷》笔记-Chapter11-实践:基于onnxruntime的手写数字识别库
第11章 实践:基于onnxruntime的手写数字识别库 读者已经跟着本书实践了很多零零散散的实例,应该能够熟练使用CMake来构建C和C程序了吧!不过,前面的实例往往都是针对某个特定功能编写的,我们可能很难将它们综合起来实…...
微软主要收入云计算,OFFICE,操作系统和游戏10大分类
微软2024年主要收入10大分类是哪些,再加一列赚钱比例 微软 2024 财年的财务数据可能尚未完全统计完成,且官方可能没有正好按 10 大分类公布主要收入情况。不过,依据微软过往的业务板块和常见的收入来源,下面是模拟的表格,赚钱比例…...
PDF预览-搜索并高亮文本
在PDF.js中实现搜索高亮功能可以通过自定义一些代码来实现。PDF.js 是一个通用的、基于Web的PDF阅读器,它允许你在网页上嵌入PDF文件,并提供基本的阅读功能。要实现搜索并高亮显示文本,你可以通过以下几个步骤来完成: 1. 引入PDF…...
随笔1 认识编译命令
1.认识编译命令 1.1 解释gcc编译命令: gcc test1.cpp -o test1 pkg-config --cflags --libs opencv 命令解析: gcc:GNU C/C 编译器,用于编译C/C代码。 test1.cpp:源代码文件。 -o test1:指定输出的可执行文件名为t…...
【谷歌设置】chrome打开页面在新tab设置(新版)
这里一定要在搜索之后点击账户,然后选择更过设置 选择在新窗口打开搜索结果...
9.翻页器组件设计开发与应用(Vue父子组件通信)
翻页器组件设计开发与使用 写在前面el-pagination分页器的用法用法介绍实战案例实现代码 Vue中的父子组件用法与通信何谓父子组件搭建Paginator.vue子组件组件初步搭建父组件向子组件传参通信子组件向父组件通信 最终代码Index.vuePaginator.vue 总结 欢迎加入Gerapy二次开发教…...
MyBatis-Flex关联查询
MyBatis-Flex关联查询 在 MyBatis-Flex 中,我们内置了 3 种方案,帮助用户进行关联查询,比如 一对多、一对一、多对一、多对多等场景,他们分别是: 方案1:Relations 注解方案2:Field Query方案3…...
Lucene.Net 分词器选择指南:盘古分词 vs 结巴分词
文章目录 前言一、核心特性对比二、典型场景推荐1. 选择盘古分词的场景2. 选择结巴分词的场景 三、关键指标实测对比1. 分词质量测试(F1值)2. 性能测试(单线程) 四、如何选择?决策树五、进阶优化建议1. 盘古分词优化方…...
YOLOv11实战电力设备缺陷检测
本文采用YOLOv11作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv11以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对电力设备缺陷数据集进行训练和优化,该数据集包含丰富的电力设备缺…...
LINUX 5 vim cat zip unzip
dd u撤销 ctrlr取消撤销 q!刚才的操作不做保存 刚才是编辑模式 现在是可视化模式 多行注释...
Redis的常见命令
Redis的常见命令 官方命令文档:https://redis.io/docs/latest/commands/ 文章目录 Redis的常见命令Redis数据结构介绍Redis通用命令1.String类型2.Hash类型3.List类型List类型的常见命令:利用List结构实现:栈、队列、阻塞队列: 4.…...
LeetCode第131题_分割回文串
LeetCode 第131题:分割回文串 题目描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 难度 中等 题目链接 点击在LeetCode中查看题目 示…...
网络钓鱼攻击的威胁和执法部门的作用(第一部分)
在当今的数字世界中,网络犯罪分子不断开发新技术来利用个人、企业和政府机构。 最普遍和最具破坏性的网络犯罪形式之一是网络钓鱼——一种社会工程手段,用于欺骗人们提供敏感信息,例如登录凭据、财务数据和个人详细信息。 随着网络钓鱼攻击…...
用Scala玩转Flink:从零构建实时处理系统
大家好!欢迎来到 Flink 的奇妙世界!如果你正对实时数据处理充满好奇,或者已经厌倦了传统批处理的漫长等待,那么你找对地方了。本系列文章将带你使用优雅的 Scala 语言,一步步掌握强大的流处理引擎——Apache Flink。 今…...
【LeetCode】算法详解#3 ---最大子数组和
1.题目介绍 给定一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 1 < nums.length < 105-104 < nums[i] < 104 2.解决思路 要求出…...
基于Python的心衰疾病数据可视化分析系统
【Python】基于Python的心衰疾病数据可视化分析系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 本项目基于Python开发,重点针对5000条心衰疾病患者的数据进行可视化分析&#…...
oracle批量删除分区
为了清理数据,往往需要删除一些分区 简单查看当前分区 附件 --创建测试表 -- drop table test_part purge;CREATE TABLE test_part (sales_id NUMBER,sale_date DATE,amount NUMBER ) PARTITION BY RANGE (sale_date) INTERVAL (INTERVAL 1 MONTH) -- 每个月创建…...
Android Compose入门和基本使用
文章目录 一、Jetpack Compose 介绍Jetpack Compose是什么Composable 函数命令式和声明式UI组合和继承 二、状态管理什么是状态Stateremember状态提升 三、自定义布局Layout ModifierLayout Composable固有特性测量使用内置组件固有特性测量自定义固有特性测量 四、项目中使用J…...
xLua的Lua调用C#的2,3,4
使用Lua在Unity中创建游戏对象,组件: 相关代码如下: Lua --Lua实例化类 --C# Npc objnew Npc() --通过调用构造函数创建对象 local objCS.Npc() obj.HP100 print(obj.HP) local obj1CS.Npc("admin") print(obj1.Name)--表方法希…...
使用 Python 连接 PostgreSQL 数据库,从 `mimic - III` 数据库中筛选数据并导出特定的数据图表
要使用 Python 连接 PostgreSQL 数据库,从 mimic - III 数据库中筛选数据并导出特定的数据图表,你可以按照以下步骤操作: 安装所需的库:psycopg2 用于连接 PostgreSQL 数据库,pandas 用于数据处理,matplot…...