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

本教程将从零开始,手把手教你如何在 LabVIEW 中动态加载一个 DLL(HexS19ParserDLL),并利用其提供的函数解析 S19 格式的固件文件,最后在界面上显示解析结果和固件数据。

准备工作

  • 安装好 LabVIEW(本教程使用 2020 版本,32位,需注意 DLL 位数与 LabVIEW 一致)。

  • 准备好 HexS19ParserDLL.dll 和对应的头文件,函数原型如下。

  • 准备一个示例 S19 文件(如 APP.s19)。

1. 创建空白工程

  1. 启动 LabVIEW,点击 "创建项目" 或从菜单 文件→新建→项目

  2. 在弹出的对话框中选择 "空白项目" ,保存为 S19Parser.lvproj

  3. 在项目浏览器中右键点击 "我的电脑" ,选择 "新建→VI" ,命名为 labview_test.vi,并保存。

2. 设计前面板(Front Panel)

我们需要放置以下控件来显示信息:

控件类型 用途 备注
字符串显示控件(路径) 显示所选 S19 文件路径 标签:S19文件路径
文件路径显示控件 显示当前加载的 DLL 路径 标签:DLL文件路径
簇(Cluster) 显示 ParserInfo 结构体信息 包含:起始地址(U32)、结束地址(U32)、总字节数(U32/U64)、记录数(U32/64)
数值显示控件(数组) 显示前16个字节数据 用 U8 数组,显示十六进制

具体操作如下:

  • 在前面板上,从控件选板拖入 "字符串显示控件"和"文件路径显示控件" ,分别命名为 S19文件路径DLL文件路径

  • 拖入一个 "簇" 控件,在里面按顺序放入四个数值显示控件(右键簇→"在后面添加元素")。依次设置:

    • 元素0:start_address,表示法 U32

    • 元素1:end_address,表示法 U32

    • 元素2:total_data_bytes,表示法根据 LabVIEW 位数选择 U32 或 U64

    • 元素3:record_count,表示法同上

      将簇标签改为 ParserInfo

  • 拖入一个 "数组" 控件,将元素类型设为 U8,标签改为 Data (前16字节)

3. 编写程序框图(Block Diagram)

3.1 使用文件对话框选择 S19 文件

  1. 在程序框图上,从 "Express→输入" 选板中放置 "文件对话框" 函数。

  2. 配置对话框:

  3. "所选路径" 输出端经过"路径转换为字符串"的控件连接到 S19文件路径 显示控件。

3.2 使用文件对话框选择 DLL 路径(动态加载)

为了让用户自由选择 DLL 位置,我们也使用文件对话框。

  1. 再放置一个 "文件对话框" ,配置类似,但文件类型选择 *.dll

  2. 将所选路径输出连接到 DLL路径 显示控件。

  3. 为了支持"在程序框图中指定路径",后续调用 CLN 节点时我们会将路径连入。

注意:通常 DLL 路径固定,但此处为演示动态加载。如果 DLL 放在固定位置,可直接使用常量路径。

3.3 配置"调用库函数节点"解析 S19 文件

  1. 在程序框图上放置 "调用库函数节点" (位于 "互连接口→库与可执行程序" 选板)。

  2. 双击节点打开配置对话框:

    • 函数 选项卡:

      • 勾选 "在程序框图中指定路径"

      • 函数名 :填入 ParseS19File

      • 调用规范 :选择 "C" (因为 DLL 使用 __cdecl)。

    • 参数 选项卡:依次添加返回值、参数1、参数2。

      • 返回值:类型为 "有符号 32 位整数"(输出)。

      • 参数1(文件名):类型 "字符串" ,数据格式 "C 字符串指针"

      • 参数2(info 结构体指针):类型 "适配至类型" ,数据格式自动变灰。

    • 点击确定。

  3. 将文件对话框输出的 S19文件路径 转换为字符串(使用 "路径至字符串转换" 函数),连接到 CLN 的第一个参数。

  4. 创建一个 ParserInfo 簇常量(在程序框图上用"簇常量",然后放入四个数值,默认值都设为0),连接到 CLN 的第二个参数。

  5. 为 CLN 节点的路径输入端连接 DLL路径(需要先将路径转换为字符串,或者直接连接路径,CLN 接受路径类型)。实际上 CLN 的 path 输入端接受路径数据类型,所以可以直接连接文件对话框输出的路径。

3.4 显示 ParserInfo 信息

  1. 在 CLN 成功后,将连接在第二个参数上的簇(现在已被 DLL 填充数据)引出。

  2. 使用 "按名称解除捆绑" 函数(位于 "编程→簇、类与变体" 选板)将簇的每个字段提取出来。

  3. 将这些字段分别连接到前面板上的 ParserInfo 簇中各元素的显示控件(可以直接将解除捆绑后的值连接到簇元素)。更简单的方法:直接将整个簇连线到前面板 ParserInfo 簇的接线端,这样就会自动更新。但为了清晰,可单独显示每个字段(现只提取start_address和total_data_bytes字段)。

3.5 读取并显示前16个字节数据

  1. 再放置一个 "调用库函数节点" ,配置调用 GetDataAtAddress

    • 同样勾选"在程序框图中指定路径",路径连接同一个 DLL 路径。

    • 参数:

      • 返回值:int32(输出)

      • address:U32(输入,这里填入解析出的 start_address

      • length:U64(输入,这里填 16)

      • buffer:适配至类型,连接一个 U8 数组(预先分配 16 个元素,可用"初始化数组"创建)

      • buffer_size:U64(输入,填 16)

    • 调用规范 C。

  2. 从 ParserInfo 簇中取出 start_address,连接到 address 参数。

  3. 创建一个长度为 total_data_bytes大小 的 U8 数组,连接到 buffer 参数(维数大小连接到"按名称解除捆绑"的total_data_bytes输出,默认值设置为0)。

  4. 调用后,检查返回值,若成功,则 buffer 数组已被填充,将其连接到前面板 Data (前16字节) 显示控件。

  5. 为了显示十六进制,右键数组显示控件,选择 "表示法→十六进制"

4. 运行测试

  1. 在前面板上,点击"解析"按钮(注意:我们还未将按钮与事件关联,建议使用"事件结构"或简单地将按钮连接到条件结构,但本教程为简化,直接运行 VI 时会自动执行一次,或在循环中等待按钮按下。推荐使用"事件结构"响应按钮点击。

  2. 为了完整,我们在主循环中放置一个事件结构,响应按钮按下事件,然后执行解析流程。

  3. 运行 VI,先选择 DLL 文件,再选择 S19 文件,点击解析,观察结果。

5. 总结与注意事项

  • 本教程演示了动态加载 DLL 的方法,适合需要灵活更换 DLL 的场景。

  • 注意位数匹配:32位 LabVIEW 用 32位 DLL,64位用 64位 DLL。

  • size_t 类型在 32位 和 64位 下大小不同,务必在 LabVIEW 簇中使用正确的数值表示法(U32 或 U64)。

  • 如果调用失败,检查 DLL 依赖(如 VC++ 运行库),可提供静态编译版本。

  • 所有 CLN 节点的调用规范务必设置为 C

通过以上步骤,您就可以在 LabVIEW 中轻松解析 S19 文件并提取固件数据了。后续您还可以扩展功能,如保存数据、分段显示等。

相关推荐
疯狂打码的少年1 小时前
【软件工程】结构化设计:模块独立性与耦合内聚
java·开发语言·笔记·软件工程
芷栀夏2 小时前
Java教育平台实战复盘:课程、考试与学习行为分析系统设计
java·开发语言·学习
从零开始的代码生活_2 小时前
C++ 多态详解:虚函数、动态绑定、抽象类与虚表原理
开发语言·c++·后端·学习·算法
执笔论英雄4 小时前
【大模型推理 】 vllm kvconnet 学习
学习·vllm
后季暖4 小时前
langgraph笔记
笔记
·醉挽清风·5 小时前
学习笔记—算法—算法题
笔记·学习·算法
西岸行者5 小时前
硬刚DeepSeek: UDPC与MTFAA的血缘辩论
笔记
a1117765 小时前
机器人导航入门指南(从 0 到 1)
笔记·学习·slam
Nebula_g6 小时前
大模型应用技术速通笔记
笔记·深度学习·机器学习·大模型