s19文件格式详解

yizhihongxing

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日

相关文章

  • (数学)p、np、npc、nphard问题

    (数学)p、np、npc、nphard问题 前言 在计算机科学中,p、np、npc、nphard问题是非常经典的一个研究领域。这些问题之间有着天然的联系和区别,它们是计算问题分类和算法研究的重要基础和工具。本文将介绍这些问题,并且探讨它们在计算机科学中的应用。 P问题 P问题,即多项式时间问题,是一类可以在多项式时间内解决的问题,通俗的讲,就是可以用计算机算…

    其他 2023年3月28日
    00
  • openwrtdns无法解析wan连接的内网服务器域名

    以下是“OpenWrt DNS无法解析WAN连接的内网服务器域名”的完整攻略,过程中包含两个示例说明的标准格式文本: OpenWrt DNS无法解析WAN连接的内网服务器域名 在OpenWrt路由器中,DNS服务可以用于解析域名。但是,当WAN连接的内网服务器域名无法解析时,需要进行一些配置。本文将介绍如何解决OpenWrt DNS无法解析WAN连接的内网服…

    other 2023年5月10日
    00
  • Mariadb数据库主从复制同步配置过程实例

    针对“Mariadb数据库主从复制同步配置过程实例”,以下是详细攻略。 一、安装Mariadb 首先需要安装Mariadb,并保证主从服务器都安装了。 例如,我们可以使用如下命令在CentOS系统中安装Mariadb: yum install mariadb mariadb-server 安装完成后,我们需要打开Mariadb服务: systemctl st…

    other 2023年6月20日
    00
  • VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析

    问题描述: 在使用Vue开发时,我们会用到数据双向绑定,当数据变更时,视图会自动更新,但是有时候我们会遇到这样的情况:通过JS代码直接修改DOM元素的值,但是发现数据没有更新。这是为什么呢? 原因分析: 在Vue中,双向数据绑定是通过Vue的响应式系统实现的。当数据发生变化时,Vue会自动触发数据的setter方法,从而更新绑定到该数据的DOM元素。而当我们…

    other 2023年6月27日
    00
  • 理解Java中的静态绑定和动态绑定

    理解Java中的静态绑定和动态绑定 Java中支持多态,也就是同一个方法可以被不同的对象调用,不同的对象会表现出不同的行为。这种多态性质也分为静态绑定和动态绑定。 静态绑定 静态绑定(Static Binding)也称为早期绑定(Early Binding),是在编译期间进行的绑定。静态绑定是根据引用类型来确定调用哪个方法的。比如下面的代码: public …

    other 2023年6月26日
    00
  • java动态线程池的简单实现思路

    Java动态线程池是Java中非常常用的一种多线程管理方式,可以根据实际情况灵活地维护线程池的大小和其它参数,以保证程序高效地运行。下面,我会详细讲解Java动态线程池的简单实现思路。 1. 使用线程池的好处 在传统的单线程以及诸如fork/join等方式下,我们很难进行多线程任务的管理,即无法根据任务的大小、复杂度等特点,来确定线程池中线程的数量,如果线程…

    other 2023年6月27日
    00
  • python3 动态模块导入与全局变量使用实例

    Python3 动态模块导入与全局变量使用实例攻略 在Python中,动态模块导入和全局变量的使用是非常常见的需求。本攻略将详细讲解如何在Python3中实现动态模块导入,并在导入的模块中使用全局变量。下面是完整的攻略过程: 1. 动态模块导入 动态模块导入是指在运行时根据需要导入模块,而不是在代码的开头导入所有可能需要的模块。这样可以提高代码的灵活性和可维…

    other 2023年7月29日
    00
  • Ext面向对象开发实践代码第1/2页

    Ext面向对象开发实践代码攻略 简介 \”Ext面向对象开发实践代码\”是一本关于使用Ext框架进行面向对象开发的实践指南。本攻略将详细讲解该书的内容,并提供两个示例说明。 第1/2页内容概述 第1/2页主要介绍了以下内容: Ext框架简介:介绍了Ext框架的特点和优势,以及它在面向对象开发中的应用。 Ext的基本概念:解释了Ext中的一些基本概念,如组件、…

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