工作之余来写写关于MCU的Bootloader刷写的相关知识,以免忘记。今天就来聊聊Hex与S19这这两种文件互相转化,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。
学习过程中如有任何疑问,可底下评论!
如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢各位的支持!
一、格式对比与转换原理
1. 核心差异
特性 | Intel HEX | Motorola S19 |
---|---|---|
起始符 | : | S |
地址扩展方式 | 04 类型(线性地址高16位) | 记录类型区分地址长度(S1/S2/S3) |
数据记录结构 | :BBAAAATTRDD...CC | SXBBAAAADD...CC |
校验和计算 | 0x100 - sum(所有字节) % 0x100 | 0xFF - sum(所有字节) % 0x100 |
终止记录 | 01 类型 | S7/S8/S9 (含入口地址) |
2. 转换关键逻辑
-
地址转换:
HEX的04
类型高16位地址需转换为S19的S3
(32位地址),反之需重建HEX的扩展地址记录。 -
数据对齐:
若地址不连续,需保留原始分块结构,不强制填充空白区域。 -
校验和重算:
两种格式校验和算法不同,需重新计算,不可直接复制。
二、HEX转S19格式
1. 转换规则
-
地址处理:
HEX的04
记录(扩展线性地址)转为S19的S3
(32位地址)。 -
数据记录:
HEX的00
类型转为S19的S3
(32位地址)或S2
(24位地址)。 -
终止记录:
HEX的01
类型转为S19的S7/S8/S9
。
三、S19转HEX格式
1. 转换规则
-
地址处理:
S19的S3
记录需拆分为HEX的04
类型(高16位)和00
类型(低16位地址)。 -
数据记录:
S19的S1/S2/S3
转为HEX的00
类型,并自动生成扩展地址记录。 -
终止记录:
S19的S7/S8/S9
转为HEX的01
类型和可能的05
类型(入口地址)。
四、Python代码实现
import logging
import os# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s',datefmt='%Y-%m-%d %H:%M:%S'
)
logger = logging.getLogger(__name__)class ConversionError(Exception):"""自定义转换异常"""passdef validate_hex_record(line):"""验证HEX记录的有效性:param line: HEX记录行:return: 解析后的记录信息字典:raises ConversionError: 无效的HEX记录"""if not line.startswith(':'):raise ConversionError(f"无效的HEX记录: {line}&#