本人最近接到一个商用汽车ECU刷写项目,发现客户提供的S19文件的地址是不连续的(如图1红色框处所示),而UDS诊断协议的36服务下载数据到ECU要求连续地址,所以需要将文件分块然后才能下载。
S19文件的数据格式和UDS诊断协议的36服务格式请读者自行查找资料,此处不再说明。
注:S19文件可以用记事本打开。
图1
为了自动适应客户后续更新文件,本人在程序中采用自动识别地址是否连续,不连续处自动分块方式,并给出每个块的首地址、末地址、字节数,同时为每个块生成CheckSum,便于数据下载后的校验。
Labview的总程序框图如图2、图3所示。
图2
图3
程序分三步进行。
第一步:导入S19文件,找出第一个块的首地址。
图4
第二步:找出分块地址点,分块地址点的查找算法为:
1、取出S19文件上一行的S3字符后跟的字节数信息;
2、取出S19文件上一行的地址信息;
3、用“本行的地址-上一行的地址”是否等于“上一行的字节数”,如果不等,表示此处地址不连续,需要分块。
图5
第三步:主要对每个块的每行数据进行校验,每行内部的数据累加(以字节为单位,2个字符为一字节),再用255-累加值得到校验值。此值与每行末尾的校验码对比,如果校验信息不匹配,程序最后输出错误信息。
校验完成后,把每行数据内的字节数、地址、校验码等辅助信息去除,连接后就是下载所需要的数据块。然后再生成每个块的总校验码,供数据下载后提供给ECU进行内部校验。
图6
本程序的块的校验码生成使用的是一个名为CRC_32CheckSum.vi的子vi,因为篇幅问题,我不在此文中展开分析,后续专门讨论。读者也可以在网上查找算法自己编写。
图7
经现场实际使用,本程序达到编写前的设定目标(实际使用时本程序作为子vi运行)。运行时的前面板如图8所示。
图8
基于Labview的S19文件自动分块程序(原创)
最新推荐文章于 2024-03-22 16:18:01 发布