s19文件格式详解

  • Post category:other

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记录用于存储程序和数据。它的格式如下:

S1llaaaattdd...cc

其中:

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

S9记录

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

S903llaaaacc

其中:

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

校验和

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

S1070000AC00000000000000000000000000000F2

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

-(0x07 + 0x00 + 0xAC + 0x00 + 0x00 + 0x00 + 0x00 + 0x00 + 0x00 + 0x00 + 0x00 + 0x00 + 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 = binascii.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, address_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文件时,应仔细检查代码,并遵循最佳实践。