学习笔记:LabVIEW调用DLL解析S19文件教程
2026/7/27 8:05:36 网站建设 项目流程

本教程将从零开始,手把手教你如何在 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 文件并提取固件数据了。后续您还可以扩展功能,如保存数据、分段显示等。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询