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"