Python之S19文件及其checksum算法实现

92 篇文章 271 订阅
2 篇文章 0 订阅

Python之S19文件及其checksum算法实现

一、概述

1.概述:
Motorola S-record是一种文件格式,由摩托罗拉在20世纪70年代中期为Motorola 6800处理器创建,以ASCII文本形式传达二进制信息的十六进制值,其文件格式也可能为SRECORD,SREC,S19,mot,.S28,S37,SX,.s,.s1,.s2,.s3,. exo,.mxt。
S-record格式文件是Freescale CodeWarrior编译器生成的后缀名为.S19的程序文件,是一段直接烧写进MCU的ASCII码,英文全称问Motorola format for EEPROM programming。
注意:
上面“是一段直接烧写进MCU的ASCII码”,这样说可能会误导初学者,因为并不是直接将ASCII码写进MCU,写进MCU前还要对S19文件进行一个解析,把有用的机器代码分解出来,然后再进行写入,写入的也不是ASCII而是二进制码。

二、S19文件解析

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

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

以下举例详细介绍每个组成部分
S19中记录类型包括S0、S1、S2、S3、S5、S7、S8、S9,S4是保留的,目前没有定义。

S0:位于文件的第一行,和其他行不同,地址部分没有使用,用“0000”置位,整行表示记录的开始;
数据场中的信息被划分为以下四个子域(此行表示程序的开始,不需烧入memory):

   name(名称):20个字符,用来编码单元名称

   ver(版本):2个字符,用来编码版本号

   rev(修订版本):2个字符,用来编码修订版本号

   description(描述):0-36个字符,用来编码文本注释。

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

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

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

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

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

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

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

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

三、S19文件的checksum算法实现

在这里插入图片描述

S0 11 0000 0000486578766965772056312E31 08 :
长度:长度包含一个字节,长度 = 地址字节数 + 数据字节数 + 校验和字节数;
0x11转换成十进制为17,即地址2+数据14+校验1 三部分长度为17;
地址:表示该行的起始地址,字节数由类型决定,S1位两个字节,S2为三个字节,S3位四个字节;
0000.由于是S0类型,所以地址位不用,使用0000置位,表示记录的开始;
数据:0000486578766965772056312E31,解析为HexviewV1.1(版本生成工具信息)
校验和:08, 校验和=0xff – (记录长度 + 存储地址 + 数据)——>0xff-(0x11+0x00+0x00 +0x00+0x00+0x48+0x65+0x78+0x76+0x69+0x65+0x77+0x20+0x56+0x31+0x2E+0x31)=0xff-(0x3F7)——>0x3F7取0xF7——>0xff-0xf7=0x08

S3 0D 00F98000 015A000000FA0400 20:
类型:S3,地址长度为4个字节
长度:0x0D转换成十进制为13,即地址4+数据8+校验1 三部分长度为13;
地址:00F98000.表明将数据015A000000FA0400下载到从地址00F98000开始的一段连续的地址中;
数据:015A000000FA0400
校验和:20, 校验和=0xff – (记录长度 + 存储地址 + 数据)——>0xff-(0x0D+0x00 +0xF9 +0x80 +0x00 +0x01 +0x5A +0x00 +0x00 +0x00 +0xFA +0x04 +0x00)=0xff-(0x2DF)——>0x3F7取0xDF——>0xff-0xDF=0x20

由上面的举例说明看出:

只有“长度” “地址” “数据”参与checksum运算,“类型”和“校验”不参与校验

运算公式为:

校验和=0xff – (长度 + 地址 + 数据)

以下是python的checksum算法实现:

    def _checksum_s19(self, string:str):
        sum_nub = 0
        # 将字符串每两个分割之后转换成16进制数字
        numbers = [int(string[i:i+2], 16) for i in range(0, len(string), 2)]

        # 求 (长度 + 地址 + 数据)的和
        for num in numbers:
            sum_nub += num

        # 求 校验和=0xff – (长度 + 地址 + 数据) ;转化成字符串之后去掉前面的'0X'字符
        sum_str = hex(0xff - (0xff & sum_nub)).upper().replace('0X','')
        
        # 格式化校验和字符串,如果长度大于2取后两位,如果长度小于2在前面补零
        if len(sum_str) < 2:
            while len(sum_str) < 2:
                sum_str = '0' + sum_str
        else:
            sum_str = sum_str[-2:]

        return sum_str

《AUTOSAR谱系分解(ETAS工具链)》之总目录

  • 42
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值