本教程将从零开始,手把手教你如何在 LabVIEW 中动态加载一个 DLL(HexS19ParserDLL),并利用其提供的函数解析 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文件路径。 -
拖入一个 "簇" 控件,在里面按顺序放入四个数值显示控件(右键簇→"在后面添加元素")。依次设置:
-
元素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 文件
-
在程序框图上,从 "Express→输入" 选板中放置 "文件对话框" 函数。

-
配置对话框:

-
将 "所选路径" 输出端经过"路径转换为字符串"的控件连接到
S19文件路径显示控件。
3.2 使用文件对话框选择 DLL 路径(动态加载)
为了让用户自由选择 DLL 位置,我们也使用文件对话框。
-
再放置一个 "文件对话框" ,配置类似,但文件类型选择
*.dll。 -
将所选路径输出连接到
DLL路径显示控件。
-
为了支持"在程序框图中指定路径",后续调用 CLN 节点时我们会将路径连入。
注意:通常 DLL 路径固定,但此处为演示动态加载。如果 DLL 放在固定位置,可直接使用常量路径。
3.3 配置"调用库函数节点"解析 S19 文件
-
在程序框图上放置 "调用库函数节点" (位于 "互连接口→库与可执行程序" 选板)。

-
双击节点打开配置对话框:
-
函数 选项卡:
-
勾选 "在程序框图中指定路径"。
-
函数名 :填入
ParseS19File。 -
调用规范 :选择 "C" (因为 DLL 使用 __cdecl)。

-
-
参数 选项卡:依次添加返回值、参数1、参数2。
-
返回值:类型为 "有符号 32 位整数"(输出)。
-
参数1(文件名):类型 "字符串" ,数据格式 "C 字符串指针" 。

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

-
-
点击确定。
-
-
将文件对话框输出的
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(输出)
-
address:U32(输入,这里填入解析出的
start_address) -
length:U64(输入,这里填 16)
-
buffer:适配至类型,连接一个 U8 数组(预先分配 16 个元素,可用"初始化数组"创建)
-
buffer_size:U64(输入,填 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位 DLL,64位用 64位 DLL。
-
size_t类型在 32位 和 64位 下大小不同,务必在 LabVIEW 簇中使用正确的数值表示法(U32 或 U64)。 -
如果调用失败,检查 DLL 依赖(如 VC++ 运行库),可提供静态编译版本。
-
所有 CLN 节点的调用规范务必设置为 C。
通过以上步骤,您就可以在 LabVIEW 中轻松解析 S19 文件并提取固件数据了。后续您还可以扩展功能,如保存数据、分段显示等。