S-Record文件解析

2022-05-25 15:22:48 浏览数 (1)

前几期文章讲到了ECU软件更新的时候用到的几个服务,今天就来介绍一下,在具体升级过程中,我们是如何将C代码编译出来的文件下载进ECU的。

常见的S-Record文件有.s19/.s28等,在下载的时候主要用TransferData (0x36)服务将解析到的数据下载到ECU中。下面就来介绍S-Record文件的格式。

S-Record文件中的数据都是以ASCII码的格式存储的,一行数据个数不超过78个,例如下面这个例子:

图1 S-Record示意

下面对这种格式进行解释:

图2 S-Record格式示意

type:类型,占两个字符,如上图1所示的"S0"等,一共有8种type的划分(S0, S1, S2, S3, S5, S7, S8, S9);

count:数据长度,占两个字符,两个字符组合成十六进制数,即为一行数据个数(包含address data checksum),例如图1第一行所示"06",组合起来即为0x06;

address:占4,6或者8个字符,这和type有关,指的是这一行数据存储的Memory起始地址;

data:占0-64个字符,这部分数据就是往0x36服务里填充的数据;

checksum:每一行最后两个字符。

不同type对应不同的address长度:

type

address

S0 Record

没有address

S1 Record

2个字节的地址,占4个字符

S2 Record

3个字节的地址,占6个字符

S3 Record

4个字节的地址,占8个字符

S5 Record

没有数据域,可以不用管这个类型的

S7 Record

没有数据域,可以不用管这个类型的

S8 Record

没有数据域,可以不用管这个类型的

S9 Record

没有数据域,可以不用管这个类型的

示例:

图3 S-Record文件解析示例

假设上图一个S-Record文件,用notepad 打开如图所示。

文件包含S0,S1,S5,S9类型的Record,S0,S5,S9 Record里面没有需要填充的数据,故跳过。

文件第二行:

  • S1表示type
  • 后面的"13"表示这一行数据的长度0x13,2个byte的address,16个byte的数据,1个byte的checksum
  • "0000",表示存储数据的内存地址为0x0000
  • address后面跟每两个ASCII码组合起来的十六进制数,有16个byte,例如,"28"表示0x28,"5F"表示0x5F
  • 最后两个ASCII码组合成1个byte的checksum,例如,"2A"表示checksum = 0x2A

最后我们用代码将画红色框部分的数据提取出来,用TransferData (0x36)进行数据传输即可。

--------------------------------------------------------------------------------------

参考资料:http://www.amelek.gda.pl/avr/uisp/srecord.htm

0 人点赞