学习笔记:LabVIEW调用DLL解析S19文件教程

发布时间:2026/9/27 14:57:10

学习笔记:LabVIEW调用DLL解析S19文件教程
本教程将从零开始手把手教你如何在 LabVIEW 中动态加载一个 DLLHexS19ParserDLL并利用其提供的函数解析 S19 格式的固件文件最后在界面上显示解析结果和固件数据。准备工作安装好 LabVIEW本教程使用 2020 版本32位需注意 DLL 位数与 LabVIEW 一致。准备好HexS19ParserDLL.dll和对应的头文件函数原型如下。准备一个示例 S19 文件如APP.s19。1. 创建空白工程启动 LabVIEW点击“创建项目”或从菜单文件→新建→项目。在弹出的对话框中选择“空白项目”保存为S19Parser.lvproj。在项目浏览器中右键点击“我的电脑”选择“新建→VI”命名为 labview_test.vi并保存。2. 设计前面板Front Panel我们需要放置以下控件来显示信息控件类型用途备注字符串显示控件路径显示所选 S19 文件路径标签S19文件路径文件路径显示控件显示当前加载的 DLL 路径标签DLL文件路径簇Cluster显示 ParserInfo 结构体信息包含起始地址(U32)、结束地址(U32)、总字节数(U32/U64)、记录数(U32/64)数值显示控件数组显示前16个字节数据用 U8 数组显示十六进制具体操作如下在前面板上从控件选板拖入“字符串显示控件”和“文件路径显示控件”分别命名为S19文件路径和DLL文件路径。拖入一个“簇”控件在里面按顺序放入四个数值显示控件右键簇→“在后面添加元素”。依次设置元素0start_address表示法 U32元素1end_address表示法 U32元素2total_data_bytes表示法根据 LabVIEW 位数选择 U32 或 U64元素3record_count表示法同上将簇标签改为ParserInfo。拖入一个“数组”控件将元素类型设为 U8标签改为Data (前16字节)。3. 编写程序框图Block Diagram3.1 使用文件对话框选择 S19 文件在程序框图上从“Express→输入”选板中放置“文件对话框”函数。配置对话框将“所选路径”输出端经过“路径转换为字符串”的控件连接到S19文件路径显示控件。3.2 使用文件对话框选择 DLL 路径动态加载为了让用户自由选择 DLL 位置我们也使用文件对话框。再放置一个“文件对话框”配置类似但文件类型选择*.dll。将所选路径输出连接到DLL路径显示控件。为了支持“在程序框图中指定路径”后续调用 CLN 节点时我们会将路径连入。注意通常 DLL 路径固定但此处为演示动态加载。如果 DLL 放在固定位置可直接使用常量路径。3.3 配置“调用库函数节点”解析 S19 文件在程序框图上放置“调用库函数节点”位于“互连接口→库与可执行程序”选板。双击节点打开配置对话框函数选项卡勾选“在程序框图中指定路径”。函数名填入ParseS19File。调用规范选择“C”因为 DLL 使用 __cdecl。参数选项卡依次添加返回值、参数1、参数2。返回值类型为“有符号 32 位整数”输出。参数1文件名类型“字符串”数据格式“C 字符串指针”。参数2info 结构体指针类型“适配至类型”数据格式自动变灰。点击确定。将文件对话框输出的S19文件路径转换为字符串使用“路径至字符串转换”函数连接到 CLN 的第一个参数。创建一个 ParserInfo 簇常量在程序框图上用“簇常量”然后放入四个数值默认值都设为0连接到 CLN 的第二个参数。为 CLN 节点的路径输入端连接DLL路径需要先将路径转换为字符串或者直接连接路径CLN 接受路径类型。实际上 CLN 的path输入端接受路径数据类型所以可以直接连接文件对话框输出的路径。3.4 显示 ParserInfo 信息在 CLN 成功后将连接在第二个参数上的簇现在已被 DLL 填充数据引出。使用“按名称解除捆绑”函数位于“编程→簇、类与变体”选板将簇的每个字段提取出来。将这些字段分别连接到前面板上的ParserInfo簇中各元素的显示控件可以直接将解除捆绑后的值连接到簇元素。更简单的方法直接将整个簇连线到前面板 ParserInfo 簇的接线端这样就会自动更新。但为了清晰可单独显示每个字段现只提取start_address和total_data_bytes字段。3.5 读取并显示前16个字节数据再放置一个“调用库函数节点”配置调用GetDataAtAddress。同样勾选“在程序框图中指定路径”路径连接同一个 DLL 路径。参数返回值int32输出addressU32输入这里填入解析出的start_addresslengthU64输入这里填 16buffer适配至类型连接一个 U8 数组预先分配 16 个元素可用“初始化数组”创建buffer_sizeU64输入填 16调用规范 C。从 ParserInfo 簇中取出start_address连接到 address 参数。创建一个长度为 total_data_bytes大小 的 U8 数组连接到 buffer 参数维数大小连接到“按名称解除捆绑”的total_data_bytes输出默认值设置为0。调用后检查返回值若成功则 buffer 数组已被填充将其连接到前面板Data (前16字节)显示控件。为了显示十六进制右键数组显示控件选择“表示法→十六进制”。4. 运行测试在前面板上点击“解析”按钮注意我们还未将按钮与事件关联建议使用“事件结构”或简单地将按钮连接到条件结构但本教程为简化直接运行 VI 时会自动执行一次或在循环中等待按钮按下。推荐使用“事件结构”响应按钮点击。为了完整我们在主循环中放置一个事件结构响应按钮按下事件然后执行解析流程。运行 VI先选择 DLL 文件再选择 S19 文件点击解析观察结果。5. 总结与注意事项本教程演示了动态加载 DLL 的方法适合需要灵活更换 DLL 的场景。注意位数匹配32位 LabVIEW 用 32位 DLL64位用 64位 DLL。size_t类型在 32位 和 64位 下大小不同务必在 LabVIEW 簇中使用正确的数值表示法U32 或 U64。如果调用失败检查 DLL 依赖如 VC 运行库可提供静态编译版本。所有 CLN 节点的调用规范务必设置为C。通过以上步骤您就可以在 LabVIEW 中轻松解析 S19 文件并提取固件数据了。后续您还可以扩展功能如保存数据、分段显示等。

相关新闻

嵌入式系统外设保护与电源管理:从硬件寄存器到系统级设计

嵌入式系统外设保护与电源管理:从硬件寄存器到系统级设计

2026/9/5 9:20:25

1. 嵌入式系统外设保护与电源管理:从硬件寄存器到系统级设计 在嵌入式系统开发,尤其是汽车电子、工业控制这类对可靠性和功耗有极致要求的领域里,我们常常会听到“系统安全”和“低功耗设计”这两个词。听起来很宏大,但落到具体的…

c++高级数据结构之并查集

c++高级数据结构之并查集

2026/9/8 12:48:00

一.相关原理 1.概念 首先,我们得明晰,并查集在图形层面是什么——一片森林,也就是很多个不相交的集合(很多棵树)。 2.表示方式 像堆那样,用数组存储每一个人: 一开始给这些学生编好号,数组下标就是他们对应的编号。…

小熊猫Dev-C++:你的第一个C++开发环境终极指南

小熊猫Dev-C++:你的第一个C++开发环境终极指南

2026/9/26 4:33:45

小熊猫Dev-C:你的第一个C开发环境终极指南 【免费下载链接】Dev-CPP A greatly improved Dev-Cpp 项目地址: https://gitcode.com/gh_mirrors/dev/Dev-CPP 你是否正在寻找一款轻量级C开发环境?厌倦了复杂配置和臃肿的IDE?小熊猫Dev-C&…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/26 19:14:12

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/27 1:30:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/27 1:30:37

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/27 1:30:35

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/27 1:30:34

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/26 16:36:51

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/26 14:29:04

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/26 13:57:22

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/26 23:35:16

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…