参考说明:
本文张部分参考如下连接文件
https://blog.csdn.net/marst437730201/article/details/128517936
1.了解hex文件
作为嵌入式软件工程师,hex文件主要出自于基于keil编译生成可以下载到MCU的代码,根究参考文章介绍,通过记事本等相关软件都可以打开看到hex文件里面的内容,如下所示内容:
:020000040800F2
:1000000028150020D90000086D8D00086F8D0008AC
:1000100000000000000000000000000000000000E0
:10002000000000000000000000000000718D0008CA
:100030000000000000000000738D0008758D0008AE
识别主要是以行为主,抛开开头一行和结尾两行的不规则内容,每行主要表达的内容依次为行开始、数据长度、地址、数据类型、数据、校验和(该部分内容如果使用参考文章中使用的编译器可以很轻易的区分出来):
位置 | 字节长度 | 说明 | 举例 |
行开始 | 无 | :代表代码行开始 | : |
数据长度 | 行开始后两个数字 | 后部分数据的长度 | 每行航开始后的02和10 |
地址 | 数据长度后的四个数字 | 表示记录所在内存地址的字段 | 第二行的0000 |
数据类型?? | 地址后面的两个数字 | ‘00’ Data Record:数据记录; ‘01’ End of File Record:文件结束记录 ‘02’ Extended Segment Address Record:扩展段地址记录 ‘03’ Start Segment Address Record:开始段地址记录 ‘04’ Extended Linear Address Record:扩展线性地址记录 ‘05’ Start Linear Address Record:开始线性地址记录 | 第一行的04 第二行的00(在hex文件中,除却开头一行结尾2行都是00) |
校验和 | 结尾两个数字 | 用于校验记录的字段,通过对其他字段进行校验计算得出。 它表示这个记录的校验和。校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足。 | 第一行结尾的F2和第二行结尾的AC |
校验和的计算方法详细解释:将行开始后的所有的数据按字节相加,即成对相加起来,然后模除256得到余数,再对这个余数求补码,最终得出的结果就是校验和。所以检测方法也很简单:在每一条记录内,将RecordMark(“:”)后的所有数据(包括Checksum)按字节相加后得到的8位数据为0,则说明数据无误。
2.读hex文件
这一步比较简单,直接可以使用python常规打开文档的命令就可以
file_place = 'E:\desktop\123.hex' # 这里注意用单引号
file_d = open(file_place,'r') # 以读的形式打开文件
file_data = file_d.readlines() # 以行的形式读取文件,这里非常建议这么读,一行正好一个地址
file_d.close() # 关闭打开的文件,单行运行可以不加,但是建议加上,养成好习惯
# 此时file_data 的每一行都与hex文件中的每一行相呼应,这种方式是最适合读取的方式
这样读出来的效果与notepad++中每一行显示的效果基本一致
3.识别hex文件
本来的目标是通过读取hex文件来识别其中的某个位置从而实现不下载hex文件到单片机里面也能读到软件版本好的变化,但是继续往下进行的时候,发现这里其实没办法直接找到变动的位置,如果你只是变动了一个数字还比较好区别,但是,代码有长有短,不同单片机的存储方式写入内容等信息都不一样,导致版本号存储的位置不是十分固定,实际上的变动并没有什么规律科研,所以,在此失败,希望嗯呢该在想到新的方式之前能解决这个问题