【intelhex】python从hex文件获取版本号

from intelhex import IntelHex
import logging
import argparse


def handle_argument():
    """获取脚本输入参数

    Returns:
        _type_: Namespace(参数)
    """
    parser = argparse.ArgumentParser(
        description="获取MCU底软版本号", usage="%(prog)s [options]"
    )
    parser.add_argument("--hex_file_path", type=str, required=True, help="hex文件路径")
    return parser.parse_args()


# 日志初始化
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    encoding="utf-8",
)
logger = logging.getLogger(name="GetMcuVersion")


def hex2dec(hex_number):
    """16进制转10进制

    Args:
        hex_number (_type_): _description_

    Returns:
        _type_: _description_
    """
    return int(hex_number, 16)


def get_hexversion_from_hexfile(hexFilePath):
    """从hex文件中读取十六进制版本号

    Args:
        hexFilePath (_type_): _description_

    Returns:
        _type_: _description_
    """
    # 创建一个IntelHex对象
    hex_file = IntelHex()

    # 加载HEX文件
    try:
        hex_file.loadhex(hexFilePath)
        logger.info("HEX文件加载成功。")
    except FileNotFoundError:
        logger.info("未找到指定的HEX文件。")
    except Exception as e:
        logger.info(f"加载HEX文件时出错:{e}")

    # 读取指定地址的字节
    address = 0x0077FC10
    if address in hex_file.addresses():
        data = hex_file.getsz(address)
        # print(f"addr的类型是:{type(data)}")
        logger.info(f"地址 0x{address:08X} 的数据是:{data.hex()}")
        logger.info(f"MCU底软版本号对应的十六进制数据是:{data.hex()[0:4]}")
        return data.hex()[0:4]
    else:
        logger.info(f"地址 0x{address:08X} 未在HEX文件中定义。")


def get_decversion_from_hexversion(version_hex):
    """十六进制版本号转换成最终需要的版本号格式

    Args:
        version_hex (_type_): _description_

    Returns:
        _type_: _description_
    """
    version_dec = hex2dec(version_hex)
    mcu_version = (
        str(version_dec)[0:1]
        + "."
        + str(version_dec)[1:3]
        + "."
        + str(version_dec)[3:5]
    )
    logger.info(f"MCU底软版本号是:{mcu_version}")
    return mcu_version


if __name__ == "__main__":
    # 获取入参
    args = handle_argument()
    version_hex = get_hexversion_from_hexfile(args.hex_file_path)
    mcu_version = get_decversion_from_hexversion(version_hex)
    print(mcu_version)
python intelhexDemo.py --hex_file_path="D:\hello.hex"
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容