資源描述:
《HEX格式介紹及分析程序》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、IntelHEX格式你熟悉嗎?——HEX格式介紹及分析程序來源:21ic 作者:LPC900 欄目:MCU技術(shù)INTELHEX格式你熟悉嗎?——HEX格式介紹及分析程序用KeilC51編程時(shí),可以自動(dòng)生成INTELHEX格式的程序文件。INTELHEX文件通常由若干個(gè)記錄組成,每個(gè)記錄都具有如下的形式:????:llAAAAttdd...ddcc其中:????開頭的冒號(hào)“:”是記錄起始標(biāo)志。????“l(fā)l”是記錄的有效數(shù)據(jù)長(zhǎng)度。????“AAAA”是裝入地址。????“tt”是記錄類型。00表示數(shù)據(jù)記錄,01表示
2、結(jié)束。????“dd...dd”是記錄中的有效數(shù)據(jù)。數(shù)據(jù)個(gè)數(shù)必須與“l(fā)l”一致。????“cc”校驗(yàn)和。將它的值與記錄中所有字節(jié)(冒號(hào)“:”除外)內(nèi)容相加,其結(jié)果應(yīng)為00,否則出錯(cuò)。舉例:????某行記錄的內(nèi)容是“:05012000B5412B215543”,則數(shù)據(jù)長(zhǎng)度ll是05H,裝入地址是0120H,記錄類型是數(shù)據(jù)記錄,有效數(shù)據(jù)是B5H、41H、2BH、21H、55H,校驗(yàn)和為43H。????在文件的最后一行,總是“:00000001FF”,表示無任何有效數(shù)據(jù),裝入地址為0000H(沒有用處),記錄類型為01
3、H,表示結(jié)束,校驗(yàn)和當(dāng)然是FFH了。以下是一個(gè)分析INTELHEX記錄的簡(jiǎn)單程序:/*????INTELHEX.h????分析處理INTELHEX格式記錄的頭文件*/#ifndef_INTEL_HEX_H_#define_INTEL_HEX_H_#include#include//定義INTELHEX記錄的結(jié)構(gòu)struct{????unsignedCHARll;????????//長(zhǎng)度????unsignedintAAAA;????????//地址????unsignedCH
4、ARtt;????????//記錄類型,0-數(shù)據(jù),1-終止????CHARdd[16];????????????//數(shù)據(jù)????CHARcc;????????????????//校驗(yàn)和}INTELHEX;/*函數(shù):AnalyseHEX()功能:分析一條HEX記錄(把INTELHEX記錄的文本轉(zhuǎn)換成INTELHEX結(jié)構(gòu))參數(shù):????hex[]是記錄的文本一行內(nèi)容????轉(zhuǎn)換后的結(jié)果保存在INTELHEX結(jié)構(gòu)中返回:????0-轉(zhuǎn)換成功????1-HEX記錄文本中有錯(cuò)誤*/bitAnalyseHEX(CHARhex
5、[]){????unsignedCHARi;????unsignedCHARj;????unsignedCHARt;????unsignedCHARn;????unsignedCHARcc;????unsignedintx;//檢查冒號(hào)????if(hex[0]!=':')return1;//檢查長(zhǎng)度????t=(toint(hex[1])<<4)+toint(hex[2]);????if(t>16)return1;????n=2*t+11;????if(n!=strlen(hex))return1;????IN
6、TELHEX.ll=t;????cc=t;//提取地址????t=(toint(hex[3])<<4)+toint(hex[4]);????cc+=t;????x=(unsignedint)t;????x<<=8;????t=(toint(hex[5])<<4)+toint(hex[6]);????cc+=t;????x+=(unsignedint)t;????INTELHEX.AAAA=x;//提取記錄類型????t=(toint(hex[7])<<4)+toint(hex[8]);????if((t==0)
7、
8、
9、(t==1))????{????????cc+=t;????????INTELHEX.tt=t;????}????else????{????????return1;????}//提取數(shù)據(jù)????i=9;????if(t==0)????{????????j=0;????????n=INTELHEX.ll;????????do????????{????????????t=(toint(hex[i++])<<4);????????????t+=toint(hex[i++]);????????????cc+=t;???
10、?????????INTELHEX.dd[j++]=t;????????}while(--n!=0);????}//提取校驗(yàn)和????t=(toint(hex[i++])<<4);????t+=toint(hex[i++]);????cc+=t;????INTELHEX.dd[j++]=t;//檢查校驗(yàn)????if(cc==0)????????return0;????el