天天看點

hex、s19檔案燒錄

S19

格式定義及含義 

S-record每行最大是78個位元組,156個字元

S-record format

type count address data checksum

 type(類型):2個字元。用來描述記錄的類型 (S0,S1,S2,S3,S5,S7,S8,S9)。

count(計數):2個字元。 用來組成和說明了一個16進制的值,顯示了在記錄中剩餘成對字元的計數。

address(位址):4或6或8個位元組。用來組成和說明了一個16進制的值,顯示了資料應該裝載的位址, 這部分的長度取決于載入位址的位元組數。2個位元組的位址占用4個字元,3個位元組的位址占用6個字元,4個位元組的位址占用8個字元。

data(資料):0—64字元。用來組成和說明一個代表了記憶體載入資料或者描述資訊的16進制的值。

checksum(校驗和):2個字元。這些字元當被配對并換算成16進制資料的時候形成了一個最低有效字元 節,該字元節用來表達作為補充資料,位址和資料庫的字元對所代表的(位元組的)補碼的byte總和。即計數值、位址場和資料場的若幹字元以兩個字元為一對, 将它們相加求和,和的溢出部分不計,隻保留最低兩位字元NN,checksum =0xFF-0xNN。

Hex

hex、s19檔案燒錄

格式定義及含義 

例如 第一行資料:020000040800F2,其實質表達的是十六進制的資料0x02 0x00 0x00 0x04 0x08 0x00 0xf2

第一個位元組 0x02表示本行資料的長度;

第二、三位元組 0x00 0x00表示本行資料的起始位址;

第四位元組 0x04表示資料類型,資料類型有:0x00、0x01、0x02、0x03、0x04、0x05。

'00' Data Rrecord:用來記錄資料,HEX檔案的大部分記錄都是資料記錄

'01' End of File Record: 用來辨別檔案結束,放在檔案的最後,辨別HEX檔案的結尾

'02' Extended Segment Address Record: 用來辨別擴充段位址的記錄

'03' Start Segment Address Record:開始段位址記錄

'04' Extended Linear Address Record: 用來辨別擴充線性位址的記錄

'05' Start Linear Address Record:開始線性位址記錄

 然後是資料,0x08 0x00

 最後一個位元組 0xf2為校驗和。

代碼修改

刷寫政策

一般我們的刷寫政策是用cmd=0x41去實作的,這裡的新增s19、hex檔案的刷寫隻針對使用者從原廠拿到資料或者從其他客戶手裡買到相應的資料檔案然後放到我們的解碼器相對應車型的刷寫檔案夾裡面(隻針對刷寫儀器自帶資料)。

這裡的檔案的操作打開方式跟文本檔案是一樣的,這裡的有效資料的擷取都需要按行的方式來擷取,分離出資料的長度、類型、位址校驗等。

s19檔案處理

S0:S格式檔案的第一個記錄,表示檔案名(含路徑),存儲位址部分沒有使用,以0000置位。此記錄表示記錄的開始,無需下載下傳到MCU。

S1: 位址為2位元組(4個字元)的記錄。

S2: 位址為3位元組的記錄。

S3: 位址為4位元組的記錄。

S5: 标記本檔案的S1、S2、S3記錄的個數(此記錄不是一個S檔案所必須的)。

S7: 地為4位元組,表示程式的開始執行位址,代碼/資料部分沒有被使用,此行表示程式的結束,無需下載下傳到MCU。

S8: 地為3位元組,表示程式的開始執行位址,代碼/資料部分沒有被使用,此行表示程式的結束,無需下載下傳到MCU。

S9: 地為2位元組,表示程式的開始執行位址,代碼/資料部分沒有被使用,此行表示程式的結束,無需下載下傳到MCU。

S123C000CF2100C6055B134A800BFE4A8000FE0000C015C031000000000000000000000092

S1: 位址為2位元組(4個bit)的記錄,即C000表示後面有效資料的刷寫位址,23表示後面有效資料的長度加上位址的長度加上校驗和92

S218FE8020F2FEC013EC31270BED31180A30700434F920F10A0B

S2: 位址為3位元組(6個bit)的記錄,即FE8020表示後面有效資料的刷寫位址,18表示後面有效資料的長度加上位址的長度加上校驗和0B

是以在代碼處理時候我們隻需要擷取到S1、S2、S3的有效資料與校驗和位元組即可。

代碼實作步驟:

  1. 傳入由協定中給定的刷寫的位址tarAddr與長度tarLen;
  2. 擷取S19檔案的每一行資料s19Data,先後對擷取出的改行資料解析兩次;
  3. 第一次解析資料s19Data,由第2個bit得到該條記錄的存儲方式判斷type類型是S1、S2還是S3;
  4. 第2次解析資料s19Data,由3中得到的type,确定位址的長度以及有效資料,分别取出位址addr、資料data;
  5. 通過取出來的位址addr與tarAddr作比較,判斷資料是不是在有效範圍内; (判斷依據: tarAddr <= addr && addr <tarAddr+tarLen,如果在這個範圍内則打開saveFlag标志開始存儲資料。這裡的存儲位址saveAddr我們預設是從0x0000開始存儲的)
  6. 通過saveFlag标志位判斷是否是有效的資料行,saveFlag =0x01則将16進制字元轉化為16進制數字的形式存儲下來并記錄轉換的長度curLen,同時記錄存儲的長度saveLen , saveFlag =0x02則重複2步驟往下依次執行。(這裡存儲之前我們還需要判斷一下,最後的一行的資料是否超過了需要刷寫的資料長度,即saveLen+curLen > tarLen,我們隻需存儲有效的長度即可)

hex檔案處理

:0200000400807A

這裡的02表示有效資料0080的長度,04表示資料類型,那麼這裡的0080的資料代表是資料的線性擴充位址,可以把這個位址看作是下一條資料的基位址highAddr,直到遇到資訊的04或者02。

:100000003CF09FE53CF09FE53CF09FE53CF09FE530

這裡的10表示有效資料3CF09FE53CF09FE53CF09FE53CF09FE5的長度,00表示資料類型,這裡表示該條資料記錄是需要刷寫到ECU中的有效資料,0000表示資料的位址lowAddr。

是以在代碼處理hex的時候我們隻需要擷取到00的有效資料與校驗和位元組即可。

代碼實作步驟:

  1. 傳入由協定中給定的刷寫的位址tarAddr與長度tarLen;
  2. 擷取hex檔案的每一行的資料,将資料解析為curLen、lowAddr,type,saveData;
  3. 通過解析出來的type,判斷資料的分類,type=0x04,則為資料的擴充位址,此時highAddr = lowAddr <<16,type=0x02,則為資料的擴充位址,此時highAddr = lowAddr <<8, 5.通過取出來的位址addr與tarAddr作比較,判斷資料是不是在有效範圍内; (判斷依據: tarAddr <= addr && addr <tarAddr+tarLen,如果在這個範圍内則打開saveFlag标志開始存儲資料。這裡的存儲位址saveAddr我們預設是從0x0000開始存儲的)
  4. 通過saveFlag标志位判斷是否是有效的資料行,saveFlag =0x01則将16進制字元轉化為16進制數字的形式存儲下來并記錄轉換的長度curLen,同時記錄存儲的長度saveLen , saveFlag =0x02則重複2步驟往下依次執行。(這裡存儲之前我們還需要判斷一下,最後的一行的資料是否超過了需要刷寫的資料長度,即saveLen+curLen > tarLen,我們隻需存儲有效的長度即可)

繼續閱讀