900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > pythone 打开文件 一行_【精品资料】用了这么多年单片机的Hex文件不懂?看这篇就够了...

pythone 打开文件 一行_【精品资料】用了这么多年单片机的Hex文件不懂?看这篇就够了...

时间:2018-07-15 08:21:34

相关推荐

pythone 打开文件 一行_【精品资料】用了这么多年单片机的Hex文件不懂?看这篇就够了...

文/Edward“Hex文件里面究竟存储的是什么内容,为什么将它一顿操作后下载到单片机里面之后就可以使得单片机神奇的按照我们想要的方式工作起来呢?”好奇的你有没有思考过这个问题?今天我们就来展开这个Hex文件的内容,一探到底,揭开它神秘的面纱。认识它我们一般将Hex文件称为单片机上面的可执行文件,或者叫它十六进制文件。Hex的由来也是截取了十六进制英文“hexadecimal”的前面三个字母。其实,可以下载到单片机内部的可执行文件不止Hex文件一种,其它的还有二进制文件,elf文件等,但是不可置否的是,现在Hex文件是使用最多的单片机可执行文件格式。Hex 全称Intel HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个Hex记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。大多数EPROM编程器或模拟器使用Intel HEX文件。打开它打开Hex文件,非常简单,你可以使用电脑上面自带的记事本工具打开,也可以使用我们最常用的J-flash去打开,也可以使用notepad++去打开。如图1所示,使用记事本去打开Hex文件。图1 记事本打开Hex文件记事本是我们所能接触到的最方便的打开Hex文件的工具,除此之外,Notepad++也可以打开Hex文件。用Notepad++打开Hex文件,它除了可以将Hex文件的有效信息都显示出来之外,还可以根据Hex文件约定的格式,分别高亮出不同颜色,以代表不同的字段信息。使读者更为醒目,如图2所示。图2 Notepad++打开Hex文件当然最专业的打开Hex文件的工具,还是J-flash,因为它是专门用来为单片机烧写程序的软件。如图3所示。图3 J-flash打开Hex文件问题思考1使用上面的三个软件中的任意软件都可以打开并且查看Hex文件。但是有好奇心强的读者就可能会问了,图3中右边那一串看着像乱码的东西到底是什么呢?上面还写着ASCII。其实这上面表示的是Hex文件中每一个十六进制字符所对应的ASCII码,如果这个字符对应ASCII码的不在打印区内,就用“.”代替。问题思考2回答到这里,可能深入思考的读者又会有问题了,我们使用Notepad++或者记事本这样的工具打开一个文件,它们最终会以对应的编码去打开。比如我们打开一个文件,这个文件里面存储了一个二进制数值0x41,那如果我们使用ASCII码去打开,那么自然而然会将0x41的ASCII码显示出来。反过来说,如果我们使用Notepad++这样子的工具去打开一个Hex文件,而它显示了图2的内容,那么这个Hex文件内部最终存储的难道是这些十六进制数的ASCII码?这个问题答案是,Hex文件是一种以文本形式存储的文件,它不像二进制文件一样以二进制的形式去存储。比如同样一串二进制数字“0500D600D2A9D28C222A”,如果将其存入二进制文件,那么它存入的势必就是“0500D600D2A9D28C222A”这样子的信息了。因此如果我们使用Notepad++这样的工具去打开bin文件,必定多数都是乱码,因为绝大多数二进制以ASCII码打开都显示不了。而同样这串数字如果存入Hex文件中,其实际存储的就是“0500D600D2A9D28C222A”的ASCII码,如0的ASCII码为0x30,5的ASCII码为0x35,依次类推。因此,如果我们以后进行文件的OTA推送时,一定要注意这个问题。而由于存储方式的不同,因此同一份程序如果用Hex文件存储至少比用Bin文件存储要大一倍。那么Hex文件与Bin文件相比,除了易于读取之外,没有很大的优点,为什么我们还要坚持不懈地使用它呢?我们知道,单片机下载程序必要的一个要素就是这个程序下载到单片机的起始地址。Bin文件是不带有任何地址信息的,因此我们下载Bin文件的时候一定要主动地去指明这个起始地址,一旦丢失或者忘记这个地址,程序都将无法正常运行。但是Hex文件它天生就会将程序的地址信息一并记录在内,因此使用Hex文件下载程序会变得更加方便。解剖它我们还是使用Notepad++来打开Hex文件。如图4所示。图4 打开的Hex文件用Notepad++可以一目了然地看出这个Hex文件每一行数据中的关键字段。接着,我们一起来探索这个文件。首先我们需要知道,一个Hex文件的每一行都是以ASCII码的“:”(0x31)开始的。而每一行Hex文件可以被分成五个关键字段,如图5所示。图5 Hex文件字段从图5中可以看出,Hex文件以每一行为一个整体,定义了数据的长度,数据类型和存储地址:第一个字节 0x02表示本行数据的长度;第二、三字节 0x00 0x00表示本行数据的起始地址;第四字节 0x04表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05。具体的数据类型如表1所示。表1数据类型字段中的详细解释然后是数据,0x08 0x00最后一个字节 0xf2为校验和,校验和的算法为:计算 0xf2前所有16进制码的累加和(不计进位),检验和 = 0x100 - 累加和。Hex文件的数据类型字段中,'04' '05',都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。对于后面的数据记录,计算地址的时候,都是以这些“基”地址为基础的。HEX文件都是由记录(RECORD)组成的。在HEX文件里面,每一行代表一个记录。记录的基本格式为::020000040800F2:1000000048B6002085010008B1450008252B0108ED:10001000B9450008C1450008C945000800000000B6:00000001FF对上面的HEX文件进行分析:

第1条记录的长度为02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0800,校验和为F2。从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为(0x0800 << 16) = 0x0800 0000后面的数据记录都以这个地址为基地址。

第2条记录的长度为10(16),LOAD OFFSET为0000,RECTYPE为00,说明该记录为数据记录。数据为48 B6 00 20 85 01 00 08 B1 45 00 08 25 2B 01 08,共16个BYTE。这个记录的校验和为ED。此时的基地址为0X0800 0000,加上OFFSET,这个记录里的16BYTE的数据的起始地址就是0x0800 0000 + 0x0000 = 0x0800 0000.

第3条记录的长度为10(16),LOAD OFFSET为0010,RECTYPE为00,说明该记录为数据记录。数据为B9 45 00 08 C1 45 00 08 C9 45 00 08 00 00 00 00,共16个BYTE。这个记录的校验和为B6。此时的基地址为0X0800 0000,加上OFFSET,这个记录里的16BYTE的数据的起始地址就是0x80000 + 0x0010 = 0x0800 0010.

第4条记录的长度为00,LOAD OFFSET为0000,TYPE = 01,校验和为FF。说明这个是一个END OF FILE RECORD,标识文件的结尾。

当我们用J-flash去下载Hex文件的时候,这个软件也会如我们分析一样,将整个Hex文件一行行写入到单片机中的特定基地址的偏移值中。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。