【嵌入式烧录/刷写文件】-S19文件解析(首行数据解析)

一、概述

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中。

三、举例

在这里插入图片描述
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

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用CAPL语言编程可以实现S19文件解析和CANoe对S19文件的读取。以下是一个简单的实现过程: 1.首先,在CANoe中创建一个新的CAPL程序。 2.通过使用ANSI C库函数来实现文件的打开和读取。使用函数fopen来打开S19文件,使用fscanf来读取文件中的数据。 3.根据S19文件格式的规则来解析读取到的数据。 4.根据解析后的数据,进行CANoe中的相关操作,比如发送CAN消息或者将数据输出到日志中。 5.使用函数fclose来关闭文件。 以下是一个简单的示例代码: ```c variables { FILE* file; int dataSize; int address; char recordType[3]; char data[256]; char checksum[3]; } on start { file = fopen("example.s19", "r"); if (file == NULL) { write("文件打开失败"); return; } while (!feof(file)) { fscanf(file, "S1%2X%4X%2s%[^*]%2s", &dataSize, &address, &recordType, &data, &checksum); //根据recordType的值判断数据类型并进行相应操作 if (strcmp(recordType, "00") == 0) { //数据记录处理 for (int i = 0; i < dataSize; i++) { //将数据发送到CANoe总线上 //例如:can_SendMsg(0x123, &data[i], 1); } } else if (strcmp(recordType, "01") == 0) { //结束记录处理 } } fclose(file); } ``` 上述示例代码是一个简单的S19文件解析的例子,根据S19文件的规则,解析文件中的数据,并根据数据类型进行相应的操作。具体的操作可以根据需求定制。 需要注意的是,以上代码中的can_SendMsg函数是一个虚拟的函数,需要根据实际情况修改为CANoe中发送CAN消息的函数。 通过以上CAPL程序的编写,我们可以实现在CANoe中对S19文件进行解析和读取。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值