s19文件格式详解

S19文件格式详解

S19文件格式是一种十六进制文件格式,用于将二进制数据转换为可读的ASCII文本格式。它通常用于将程序和数据下载到嵌入式中。本文将介绍S19文件格式的详细信息,包括文件结构、记录类型、记录格式、校验和等内容。

文件结构

S19文件格式由多行ASCII文本组成,每行以字母S开头,后跟一个数字,表示记录类型。每个记录由字段组成:

  • 记录类型:一个数字,表示记录类型。
  • 记录长度:一个数字,表示记录长度。
  • 地址:一个十六进制数字,表示数据的起始地址。
  • 数据:一个十六进制数字,表示数据本身。
  • 校验:一个十六进制数字,用于检查记录的完整性。

以下是一个S19文件的示例:

S0030000FC
S1070000AC00000000000000000000000000000F2
S1070010FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2
S1070020FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2
S1070030FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2
S1070040FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2
S1070050FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2
S1070060FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92
S1070070FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82
S1070080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72
S1070090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62
S10700A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
S10700B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42
S10700C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32
S10700D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22
S10700E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12
S10700F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02
S9030000FC

在上述示例中,我们可以看到三个记录类型:S0、S1和S9。每个记录都包含记录类型、记录长度、地址、数据和校验和字段。S1记录包含程序和数据,S9记录标识文件结束。

记录类型

S19文件格式定义了多种记录类型,每种记录类型都有不同的用途。以下是S19文件格式的常记录类型:

  • S0记录:文件头记录,用于标识文件类型和长度。
  • S1记录:记录,用于存储程序和数据。
  • S9记录:文件结束记录,用于标识文件结束。

记录格式

S0记录

S0记录用于标识文件类型和长度。它的格式如下:

S0llaaaatt[dd...]cc

其中:

  • S0:记录类型。
  • ll:记录长度,表示地址字段和数据字段的长度之和。
  • aaaa:起始地址,通常为0。
  • tt:文件类型,通常为00。
  • dd:数据字段,通常为空。
  • cc:校验和,表示记录的完整性。

S1记录

S1记录用于存储程序和数据。它的格式如下:

S1llaaadd...cc

其中:

  • S1:记录类型。
  • ll:记录长度,表示地址字段和数据字段的长度之和。
  • aaaa:起地址,表示数据的起始地址。
  • tt:数据类型,通常为00。
  • dd:数据字段,表示程序和数据。
  • cc:校验和,表示记录的完整性。

S9记录

S9记录用于标识文件结束。的格式如下:

S903llaaaacc

其中:

  • S9:记录类型。
  • ll:记录长度,通常为03。
  • a:起始地址,通常为0。
  • cc:校验和,表示记录的完整性。

校验和

S19文件格式使用校验和来查记录的完整性。校验和是记录长度、地址和数据字段的和的补码。例如,于以下记录:

S1070000AC00000000000000000000000000000F2

记录长度为0x07,地址为0x0000AC,数据为0x0000000000000000000000000000000F,因此校验和为:

-(x07 + 0x00 + 0xAC + 0x00 + 0x00 + 0x00 + 0x00 + 0x00 + 0x00 + 0x00 + 0x00 + x00 + 0x00 + 0x00 + 0x00 + 0x0F) & 0xFF
= 0xF2

如果计算出的校验和与记录中校验和不匹配,则表示记录已被损坏。

示例1生成S19文件

以下是一个示例,示如何使用Python生成S19文件:

import binascii

def generate_s19_file(data, start_address):
    s19_data = ''
    address = start_address
    for i in range(0, len(data), 16):
        chunk = data[i:i+16]
        length = len(chunk) + 3
        record_type = '01'
        address_str = '{:08X}'.format(address)
        data_str = bin.hexlify(chunk).decode('utf-8').upper()
        checksum = (length + address + int(data_str[:2], 16) + int(data_str[2:4], 16) + int(data_str[4:6], 16 + int(data_str[6:8], 16)) & 0xFF
        s19_data += 'S{}{:02X}{}{}{:02X}\n'.format(record_type, length,_str, data_str, checksum)
        address += len(chunk)
    s19_data += 'S9030000FC\n'
    return s19_data

在上述示例中,我们定义了一个generate_s19_file函数,接受二进制数据和起始地址作为参数,并返回S19文件格式的字符串。该将数据分成16字节的块,并为每个块一个S1记录。最后,它添加一个S9记录,标识文件结束。

示例2:解析S19文件

以下是一个示例,演示如何使用Python解S19文件:

def parse_s19_file(s19_data):
    = bytearray()
    for line in s19_data.split('\n'):
        if line.startswith('S1'):
            length = int(line[2:4], 16) - 3
            address = int(line[4:12], 16)
            checksum = int(line[-2:], 16)
            data_str = line[8:-2]
            for i in range(0, length, 2):
                byte = int(data_str[i:i+2], 16)
                data.append(byte)
            calculated_checksum = (length + address + sum(data[-length:])) & 0xFF
            if calculated_checksum != checksum:
                raise ValueError('Checksum error')
    return data

在上述示例中,我们定义了一个parse_s19_file函数,它接受S19文件格式的字符串作为参数,并返回二进制数据。该函数遍历S1记录,将数据解析为二进制格式,并验证校验和。如果校验和不匹配,则引发ValueError异常。

通过以上示例,我们可以了解如何生成和解析S19文件。在使用S19文件时,应仔细检查代码,并遵循最佳实践。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:s19文件格式详解 - Python技术站

(0)
上一篇 2023年5月6日
下一篇 2023年5月6日

相关文章

  • 超级详细实用的pycharm常用快捷键

    下面是“超级详细实用的PyCharm常用快捷键”的攻略。 一、快捷键简介 快捷键是提高编程效率的重要工具,特别是在PyCharm这样的IDE(综合开发环境)中。下面是一些常用的PyCharm快捷键: Ctrl + C/V:复制/粘贴 Ctrl + Z/Y:撤销/恢复 Ctrl + D:复制一行或当前光标所在的部分并粘贴到下一行 Ctrl + W:选中当前光标…

    other 2023年6月27日
    00
  • 如何在plsql/developer的命令窗口执行sql脚本

    如何在PL/SQL Developer的命令窗口执行SQL脚本 PL/SQL Developer是一款比较流行的Oracle数据库开发工具,除了拥有便捷的界面操作外,还可以通过命令窗口执行SQL脚本。下面就来介绍一下如何在PL/SQL Developer的命令窗口执行SQL脚本。 步骤一:打开命令窗口 首先打开PL/SQL Developer,选择一个连接到…

    其他 2023年3月29日
    00
  • Java编程实现从尾到头打印链表代码实例

    下面是Java编程实现从尾到头打印链表代码实例的完整攻略。 1. 思路分析 从尾到头打印链表,可以想到两种方式: 反转链表,并正序打印 从尾到头遍历链表,借助栈的先进后出特性 我们可以选择使用第二种方式来实现。具体步骤如下: 从头到尾遍历链表,将节点值依次入栈 遍历完整个链表后,依次弹出栈的元素,即可实现从尾到头打印链表 2. 代码实现 2.1 定义List…

    other 2023年6月27日
    00
  • 4种常规的登录认证方式

    以下是关于“4种常规的登录认证方式”的完整攻略,包括基本概念、步骤和两个示例。 基本概念 登录认证是指用户在访问应用程序或网站时,需要供一些凭据来证明自己的身份。常见的登录认证方式包括基本认证、摘要认证、OAuth认证和ID认证。 步骤 以下是种常规的登录认证方式的步骤: 基本认证:基本认证是一种简单的认证方式,它要求用户提供用户名和密码。步骤如下: 用户在…

    other 2023年5月7日
    00
  • python类静态变量

    以下是关于Python类静态变量的完整攻略,包括定义、使用和两个示例说明。 定义 在Python中,类静态变量是指在类定义中的变量,它们与类的实例无关,而是与类本身相关联。类静态变量可以在类的任何方法中使用也可以在类外使用。 在Python中,可以使用以下语法定义类静态变量: class MyClass: my_static_var = 42 在这个示例中,…

    other 2023年5月7日
    00
  • Mac下用Java调用c/c++的思路详解

    Mac下用Java调用c/c++的思路详解 简介 Java是一门便于开发和跨平台的编程语言,而c/c++是性能优异的编程语言,如何在Java程序中调用c/c++代码是很多开发人员所关注的问题。 本文将介绍在Mac环境下使用Java调用c/c++代码的思路,包括JNI技术、编写本地函数库和使用开源库等方法。 JNI技术 JNI是Java Native Inte…

    other 2023年6月26日
    00
  • Java结构型设计模式中建造者模式示例详解

    Java结构型设计模式中建造者模式示例详解 什么是建造者模式? 建造者模式是一种创建型设计模式,它允许你创建复杂对象的过程与其表示相分离。通过使用相同的构建过程,可以创建不同的表示。 示例1:创建一个电脑对象 假设我们要创建一个电脑对象,它有许多可选的组件,如CPU、内存、硬盘等。使用建造者模式可以将创建过程与表示分离,使得我们可以根据需要选择不同的组件来构…

    other 2023年8月6日
    00
  • C语言memset函数详解

    C语言memset函数详解 在C语言中,涉及到对一段内存空间的清空或赋值操作时,可以使用memset函数。本文将对memset函数进行详细讲解。 函数定义 void *memset(void *s, int c, size_t n); 这里的参数含义是: s:需要进行清空或赋值操作的内存空间的首地址。 c:需要进行赋值的内容。由于参数类型是int,实际上只会…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部