S19文件和HEX文件解析

文章详细介绍了S19文件和HEX文件的解析过程,包括记录类型、长度计算、地址、数据和校验和的计算方法。S19文件的记录类型如S0、S1、S3等各有特定含义,HEX文件则包含数据记录、文件结束记录等不同类型的记录。两种文件格式都在编程和固件更新中起到关键作用。
摘要由CSDN通过智能技术生成

目录

一、S19文件解析:

1、记录类型

2、长度计算

3、地址

4、数据

5、校验和及计算

二、HEX文件解析

1、记录类型

 2、起始地址

3、数据长度

4、校验和


一、S19文件解析:

S19文件格式与mot文件只是命名方式不同,看数据格式的话,其实是同一种文件,这里以S19文件为例。

S19文件每一行数据全部由记录类型和十六进制数字组成,包含类型、长度、地址、数据和校验和五个部分。

 上面图片中“S3”为类型,“15”为长度,意味着整行记录(除类型和长度)总共有21字节,“00008020”为该记录起始地址,“54455001000000000000000000000000”为数据,共16个字节,“70”是校验和,这一行就是将数据一次刷写到起始地址为“20100060”的连续地址中去,上一行的数据结构也是如此对应的。

1、记录类型

S19中记录类型包括S0、S1、S2、S3、S5、S7、S8、S9等

S0,位于文件的第一行,和其他行不同,地址部分没有使用,用“0000”置位,整行表示记录的开始,FC为校验和;

S1表示地址长度为两字节(4字符)的记录,包含类型、长度、地址、数据和校验和五个部分;

S2表示地址长度为三字节(6字符)的记录,包含类型、长度、地址、数据和校验和五个部分;

S3表示地址长度为四字节(8字符)的记录,包含类型、长度、地址、数据和校验和五个部分;

S5表示文件中含有S1、S2、S3记录的个数,其后不接数据,包含S5的记录并不是每个文件必须的;

S7表示地址长度为四字节(8字符)的记录,包含类型、长度、地址和校验和四个部分,此行表示程序的结束;

S8表示地址长度为三字节(6字符)的记录,包含类型、长度、地址和校验和四个部分,此行表示程序的结束;

S9表示地址长度为两字节(4字符)的记录,包含类型、长度、地址和校验和四个部分,此行表示程序的结束;

只有S1、S2、S3、S5需要写入Flash中。

2、长度计算

长度包含一个字节,长度 = 地址字节数 + 数据字节数 + 校验和字节数。

3、地址

 表示该行的起始地址,字节数由类型决定,S1位两个字节,S2为三个字节,S3位四个字节。

4、数据

包含的要刷写入控制器的数据如:“54455001000000000000000000000000”

5、校验和及计算

校验和内容为一个字节,计算公式:校验和 = 0XFF - 长度字节 - 地址字节 - 数据字节

 如上图计算为校验和 = 0xFF - (0x15 + 0x20 + 0x10 + 0x00 + 0x60 + 0x54 + 0x45 + 0x50 + 0x01 ... + 0x00 + 0x00 + 0x70) = 0x70

其中(0x15 + 0x20 + 0x10 + 0x00 + 0x60 + 0x54 + 0x45 + 0x50 + 0x01 ... + 0x00 + 0x00 + 0x70) = 0x18F 取8F。

二、HEX文件解析

Hex文件每一行数据全部由十六进制数字组成,包含 :、数据长度、起始地址、记录类型、数据、校验和六个部分。

 上图中,每一行记录都以“:”开头,“10”为后面的数据长度,表示该记录有16字节的数据,“01D0”

为该行记录的起始地址中的低位,后面的“00”为该记录的类型,

“780A9528444444444444444444444444”,为该记录所包含的全部16字节数据,“B0”为校验和。

1、记录类型

Hex文件记录类型包括00、01、02、03、04、05等,每一种都包含不同的含义:

00:数据记录;

01:文件结束记录;

02:扩展段地址记录;

03:开始段地址记录;

04:扩展线性地址记录;

05:开始线性地址记录;

上图中截取了三种记录类型04、00和01

第一行中数据长度为02,表示两字节的数据“2010”,04位扩展线性数据记录,扩展地址就是04记录中的数据位“2010”,

该地址就作为一下每行的起始地址中的高位,第二行记录中的地址“0000”为低位,那么第二行记录的起始地址就是“20100000”,

第三行记录的起始地址就是“20100010”,“2010”会一直作为高位,直到下一个扩展线性记录的出现,

最后一行为文件记录的结束。

 2、起始地址

起始地址一般由高位和低位组成,即04记录中的地址加上00记录中的地址:如以上所说的“20100000”,“20100010”。

3、数据长度

包含一个字节,即后面数据的字节数的十六进制表示:如上“0x10”表示长度为16个字节。

4、校验和计算

包含一个字节,校验和=0xFF&(0x100-(长度字节+地址字节+类型字节+数据字节))

长度字节 + 地址字节 + 类型字节 + 数据字节 = 0x10 + 0x00 + 0x60 + 0x00 + 0x54 + ... + 0x00 + 0x00 = 0x15A

校验和 = 0xFF&(0x100 - 0x15A) = 0xA6

解析hex文件的代码可以分为以下几个步骤: 1. 打开hex文件,读取数据 ``` file = open("test.hex", "r") data = file.readlines() ``` 2. 解析每行数据 ``` for line in data: # 去除换行符 line = line.strip() # 解析行号、数据类型、地址和数据 line_no = int(line[1:3], 16) data_type = int(line[7:9], 16) addr = int(line[3:7], 16) line_data = line[9:-2] # 根据数据类型解析数据 if data_type == 0: # 数据记录 for i in range(0, len(line_data), 2): byte = int(line_data[i:i+2], 16) # 处理数据 elif data_type == 1: # 结束记录 break elif data_type == 2: # 扩展线性地址记录 addr_offset = int(line_data, 16) * 16 elif data_type == 3: # 扩展段地址记录 pass else: # 其他记录类型 pass ``` 3. 处理数据 根据数据类型解析出的数据,可以进行相应的处理。例如,如果是数据记录,可以将数据写入指定的内存地址;如果是扩展线性地址记录,可以计算出偏移地址。 完整的代码示例: ``` file = open("test.hex", "r") data = file.readlines() addr_offset = 0 for line in data: # 去除换行符 line = line.strip() # 解析行号、数据类型、地址和数据 line_no = int(line[1:3], 16) data_type = int(line[7:9], 16) addr = int(line[3:7], 16) + addr_offset line_data = line[9:-2] # 根据数据类型解析数据 if data_type == 0: # 数据记录 for i in range(0, len(line_data), 2): byte = int(line_data[i:i+2], 16) # 处理数据 print(hex(addr), hex(byte)) addr += 1 elif data_type == 1: # 结束记录 break elif data_type == 2: # 扩展线性地址记录 addr_offset = int(line_data, 16) * 16 elif data_type == 3: # 扩展段地址记录 pass else: # 其他记录类型 pass file.close() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

博学之~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值