实现了一个自动化功能,主要用于keil编译时对项目生成的 .hex
文件进行管理,并基于特定的版本号和当前编译时间对hex文件进行重命名。以下是它的功能及特点介绍:
功能特点:
-
版本号提取:代码能够从指定的C源文件(这里
main.c
)中自动提取版本号。这通常对于嵌入式软件开发中的版本控制非常有用。 -
日期获取:脚本可以获取当前编译时间,并按照指定格式进行hex的重命名。对于生成的hex能知道最新编译的时间。
-
文件搜索:它会在当前目录下搜索
.uvprojx
文件,这些文件通常与嵌入式项目的开发环境(如uVision)相关联。然后,从文件名中提取出相应的hex名称。 -
文件复制与重命名:脚本会在当前目录中获取子目录检索查找对应的
.hex
文件。如果找到该文件,脚本会将其复制到当前目录,并在文件名中添加版本号、下划线和日期,以便轻松区分不同版本和编译日期的文件。 -
错误处理:如果在指定的路径下找不到 “ 版本 ” 、 “ .hex ”
特点:
-
自动化:整个过程完全自动化,无需用户手动干预,大大提高了工作效率。
-
灵活性:通过修改配置文件或函数参数,用户可以轻松适应不同的项目结构和命名约定。
-
可扩展性:代码结构清晰,易于维护和扩展。例如,可以添加更多功能来支持其他类型的文件或更复杂的版本控制策略。
-
版本控制:通过添加版本号和日期到文件名中,用户可以轻松跟踪和管理项目的不同版本和编译记录,这对于长期开发和维护项目至关重要。
-
错误提示:当发生错误(如找不到文件)时,脚本会提供明确的错误提示,帮助用户快速定位问题。
使用注意事项:
①该程序需要放在与 “ *****.uvprojx ” 相同目录进行运行。
②可以把该 “ *.py ” 程序编译成 “ *.exe ” 文件,在keil中设置编译自动运行 “ *.exe ” 文件,这样就自动生成了定制的HEX文件。步骤如下:
部分python代码:
def get_Date():
# 获取当前本地时间和日期
now = datetime.now()
# 提取年、月、日、小时、分钟
year = now.year
month = str(now.month).zfill(2) # 使用 zfill 方法确保月份是两位数
day = str(now.day).zfill(2) # 使用 zfill 方法确保日期是两位数
# 打印这些变量
print("编译时间:", now)
return str(year)+str(month)+str(day)
def project_name_file():
# 使用glob模块查找所有.ioc文件
ioc_files = glob.glob(os.path.join(path, '*.uvprojx'))
# 提取文件名(不包括路径和后缀)
file_names = [os.path.splitext(os.path.basename(file_path))[0] for file_path in ioc_files]
return file_names # 直接返回列表,而不是字符串
def copy_hex_file_to_current_dir(version,Date):
# 获取文件名列表
file_names = project_name_file()
for file_name in file_names:
# 构建目标文件的绝对路径
target_file_path = os.path.join(current_dir, file_name, file_name + ".hex")
# 检查文件是否存在
if os.path.exists(target_file_path):
# 构建复制到当前目录的新文件的路径
new_file_path = os.path.join(current_dir, file_name + version +'_' + Date + ".hex")
# 复制文件
shutil.copy2(target_file_path, new_file_path)
print('生成的最新HEX文件目录:',new_file_path)
else:
print(f"File {target_file_path} does not exist.")
# 提取版本号
def extract_version_from_file():
# 构建目标文件的绝对路径
target_file_path = os.path.join(parent_dir, "Core", "Src", "main.c")
with open(target_file_path, 'r') as file:
content = file.read()
match = re.search(r'Ver_([0-9][.][0-9]+)', content) # 注意这里添加了+来匹配多个数字
if match:
print('获取到程序版本号: ',match.group())
return match.group()
else:
return None
# 提取版本号
version = extract_version_from_file()
if version:
Date = get_Date()
copy_hex_file_to_current_dir(version,Date)
else:
print("Version not found in main.c file.")
完整python代码及生成的exe程序:
https://download.csdn.net/download/qq_26043945/89291038