飞思卡尔 s19 转 bin

1. S19文件格式详解

S-record格式文件是Freescale CodeWarrior编译器生成的后缀名为.S19的程序文件,是一段直接烧写进MCU的ASCII码,英文全称问Motorola format for EEPROM programming。

【注意:编者】:
上面“是一段直接烧写进MCU的ASCII码”,这样说可能会误导初学者,因为并不是直接将ASCII码写进MCU,写进MCU前还要对S19文件进行一个解析,把有用的机器代码分解出来,然后再进行写入,写入的也不是ASCII而是二进制码。
网上有关S-record格式文件的资料很少,经过我的收集和实验,整理出以下文档,方便大家对Freescale单片机做深入了解。

1、格式定义及含义
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。

S0 Record:记录类型是“S0” (0x5330)。地址场没有被用,用零置位(0x0000)。数据场中的信息被划分为以下四个子域:
name(名称):20个字符,用来编码单元名称
ver(版本):2个字符,用来编码版本号
rev(修订版本):2个字符,用来编码修订版本号
description(描述):0-36个字符,用来编码文本注释
此行表示程序的开始,不需烧入memory。
S1 Record:记录类型是“S1” (0x5331)。地址场由2个字节地址来说明。数据场由可载入的数据组成。
S2 Record:记录类型是“S2” (0x5332)。地址场由3个字节地址来说明。数据场由可载入的数据组成。
S3 Record:记录类型是“S3” (0x5333)。地址场由4个字节地址来说明。数据场由可载入的数据组成。
S5 Record:记录类型是“S5” (0x5335)。地址场由2字节的值说明,包含了先前传输的S1、S2、S3记录的计数。没有数据场。
S7 Record:记录类型是“S7” (0x5337)。地址场由4字节的地址说明,包含了开始执行地址。没有数据场。此行表示程序的结束,不需烧入memory。
S8 Record:记录类型是“S8” (0x5338)。地址场由3字节的地址说明,包含了开始执行地址。没有数据场。此行表示程序的结束,不需烧入memory。
S9 Record:记录类型是“S9” (0x5339)。地址场由2字节的地址说明,包含了开始执行地址。没有数据场。此行表示程序的结束,不需烧入memory。
根据不同的描述信息,在以上三种不同的结束行中选择一种使用

2、EXAMPLE

2.1 example I
S19文件首行: S0 21 0000 36384B50524F47202020313143524541544544204259204541535936384B 6D
首行翻译信息: S0 0000 6 8 K P R O G 1 1 C R E A T E D B Y E A S Y 6 8 K
色块图例:module name version number revision number checksum
checksum的算法:
0x21+0x00+0x00+0x36+0x38+0x4B+0x50+0x52+0x4F+0x47+0x20+0x20+0x20+0x31+0x31+0x43+0x52+0x45+0x41+0x54+0x45+0x44
+0x20+0x42+0x59+0x20+0x45+0x41+0x53+0x59+0x36+0x38+0x4B=0x792
checksum=0xFF-0x92=6D
注意:EASy68K总是用S8 record作为结束行。

2.2 example II
S1 23 C000 CF1400790011CC09395B105A124A8046304A8000300001C01BCB73140007340027
色块图例:type count address data checksum

2.3 example III
S2 24 308000 C61E877C1516C6197B151ACE04C07E15187A153EC74A90F9301D026A01C6017B F0
色块图例:type count address data checksum

3、另附Freescale HCS12DP256B 16位单片机空程序S19文件:
S0520000453A5C576F6F64795C4C6561726E696E675C50726F6772616D6D655C42444DD2FDB5BCB3CCD0F25C44556D795C447032 35365C62696E5C48435331325F53657269616C5F4D6F6E69746F722E6162735A
S123C000CF1100790011CC09395B105A124A8004304A8000300000C01BC01F00000000001B
S104C020001B
S105FFFEC0003D
S22430800010EF20FEFEC017FDC015270E35ED31EC3169700434FB310326F2FEC019EC31274F
S2113080200BED31180A30700434F920F10AE7
S804000000FB

2. 参考代码

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAX_EXTENSION_SIZE 16
#define MAX_LINE_SIZE 1024
#define MAX_FILE_NAME_SIZE 260
typedef char filetype[MAX_FILE_NAME_SIZE];

filetype    Filename;  
FILE *fin,*fout;
int filemode;

unsigned char Ascii2Int(unsigned char tmp0, unsigned char tmp1)
{
    unsigned char s[2];
    unsigned char value;
    s[0] = 0;
    s[1] = 0;

    if (tmp0 >= '0' && tmp0 <= '9')
        s[0] = tmp0 - '0';
    else if (tmp0 >= 'a' && tmp0 <='f')
        s[0] = tmp0 - 'a' + 0xA;
    else if (tmp0 >= 'A' && tmp0 <= 'F') 
        s[0] = tmp0 - 0x61 + 0XA;

    if (tmp1 >= '0' && tmp1 <= '9')
        s[1] = tmp1 - '0';
    else if (tmp1 >= 'a' && tmp1 <= 'f')
        s[1] = tmp1 - 'a' + 0xA;
    else if (tmp1 >= 'A' && tmp1 <= 'F')
        s[1] = tmp1 - 'A' + 0xA;

    value = s[0]<<4;
    value = value + s[1];

    return value;
}

void PutExtension(char *Flnm, char *Extension)
{
    char *Period;        /* location of period in file name */
    char Samename = -1;

    /* This assumes DOS like file names */
    /* Don't use strchr(): consider the following filename:
     ../my.dir/file.hex
    */
    if ((Period = strrchr(Flnm,'.')) != NULL)
        *(Period) = '\0';

    if (strcmp(Extension, Period + 1) == 0)
        Samename = 0;

    strcat(Flnm,".");
    strcat(Flnm, Extension);
    if (0 == Samename) {
        printf ("Input and output filenames (%s) are the same.", Flnm);
    }
}


int main(int argc, char *argv[])
{
    unsigned char tmp[2];
    char buf[20];
    unsigned char value = 0;
    unsigned char chksum = 0;
    unsigned char num = 0;
    unsigned char func = 0xff;
    int addr = 0;
    int size = 0;

    /* line inputted from file */
    char Line[MAX_LINE_SIZE];
    char Extension[MAX_EXTENSION_SIZE]; 
    strcpy(Extension, "bin");

    /*读取文件名*/
    strncpy(Filename, argv[argc -1], sizeof(Filename));

    /*打开或创建两个文件*/
    fin = fopen(Filename, "r");
    PutExtension(Filename, Extension);
    fout = fopen(Filename,"wb");

    while(!feof(fin))
    {
        /*读取一行数据,以's'开始*/
        while (1) {
            fread(tmp, sizeof(char), 1, fin);
            /*寻找行首*/
            if (tmp[0]=='S'||tmp[0]=='s')
                break;

            if (feof(fin)) {
                fclose(fin);
                fclose(fout);
                printf("file convert ok!\n");
                return;
            }
        }

        chksum = 0;
        addr = 0;

        /*读取's'后面的字符: type*/
        fread(tmp, sizeof(char), 1, fin);
        func = tmp[0];

        /*获取数据数量,两个字符: count*/
        fread(tmp, sizeof(char), 2, fin);
        num = Ascii2Int(tmp[0], tmp[1]);
        chksum += num;

        /*类型type, 处理每一行的地址address数据*/
        switch (func) {
        case '0':
                fread(tmp, sizeof(char), 2, fin);
                value = Ascii2Int(tmp[0], tmp[1]);
                chksum += value;
                addr += value;
                addr = addr<<8;

                fread(tmp, sizeof(char), 2, fin);
                value = Ascii2Int(tmp[0], tmp[1]);
                chksum += value;
                addr += value;
                num -= 2;
                break;

         case '1':
                fread(tmp, sizeof(char), 2, fin);
                value = Ascii2Int(tmp[0], tmp[1]);
                chksum += value;
                addr += value;
                addr=addr<<8;

                fread(tmp, sizeof(char), 2, fin);
                value = Ascii2Int(tmp[0], tmp[1]);
                chksum += value;
                addr += value;
                num -= 2;
                break;

         case '2':
                fread(tmp, sizeof(char), 2, fin);
                value = Ascii2Int(tmp[0], tmp[1]);
                chksum += value;
                addr += value;
                addr = addr<<8;

                fread(tmp, sizeof(char), 2, fin);
                value = Ascii2Int(tmp[0], tmp[1]);
                chksum += value;
                addr += value;
                addr = addr<<8;

                fread(tmp,sizeof(char), 2, fin);
                value = Ascii2Int(tmp[0], tmp[1]);
                chksum += value;
                addr += value;
                num -= 3;
                break;

        case '3':
                fread(tmp, sizeof(char), 2, fin);
                value=Ascii2Int(tmp[0], tmp[1]);
                chksum += value;
                addr += value;
                addr = addr<<8;

                fread(tmp, sizeof(char), 2, fin);
                value = Ascii2Int(tmp[0], tmp[1]);
                chksum += value;
                addr += value;
                addr = addr<<8;

                fread(tmp, sizeof(char), 2, fin);
                value = Ascii2Int(tmp[0], tmp[1]);
                chksum += value;
                addr += value;
                addr = addr<<8;

                fread(tmp, sizeof(char), 2, fin);
                value = Ascii2Int(tmp[0], tmp[1]);
                chksum += value;
                addr += value;
                num -= 4;
                break;

        case '5':
                break;

        case '7':
                break;

        case '8':
                break;

        case '9':
                break;

        default :
                break;
        }

#if 0
        switch (func) {
        case '0':
           printf("\n module version:\n");
           break;

        case '1':
           //Memo1->Lines->Add(" \n地址 ");
           //sprintf(buf," 0x%x ",addr);
           //Memo1->Text=Memo1->Text+buf;
           //Memo1->Text=Memo1->Text+"-数据信息:";
           break;

        case '2':
           //Memo1->Lines->Add(" \n地址 ");
           //sprintf(buf," 0x%x ",addr);
           //Memo1->Text=Memo1->Text+buf;
           //Memo1->Text=Memo1->Text+"-数据信息:";
           break;

        case '3':
           //Memo1->Lines->Add(" \n地址 ");
           //sprintf(buf," 0x%x ",addr);
           //Memo1->Text=Memo1->Text+buf;
           //Memo1->Text=Memo1->Text+"-数据信息:";
           break;

        case '5':
           printf("\n data line count:\n");
           break;

        case '7':
           printf(" \n program start address:\n");
           break;

        case '8':
           printf(" \n program start address:\n");
           break;

        case '9':
           printf(" \n program start address:\n");
           break;
        }
#endif

        /*循环读取一行数据, 写入.bin文件中*/
        while (num > 1) {
            fread(tmp, sizeof(char), 2, fin);
            num--;
            value = Ascii2Int(tmp[0], tmp[1]);

            switch (func) {
                case '0':
//                  sprintf(buf," 0x%2x ",value);
//                  printf("s0 text: %s\n", buf);
                    break;

                case '1':
//                  sprintf(buf," 0x%2x ",value);
//                  printf("s0 text: %s\n", buf);
                    fwrite(&value, sizeof(char), 1, fout);
                    size++;
                    break;

                case '2':
//                  sprintf(buf," 0x%2x ",value);
//                  printf("s0 text: %s\n", buf);
                    fwrite(&value, sizeof(char), 1, fout);
                    size++;
                    break;

                case '3':
//                  sprintf(buf," 0x%2x ",value);
//                  printf("s0 text: %s\n", buf);
                    fwrite(&value, sizeof(char), 1, fout);
                    size++;
                    break;

                case '5':
//                  sprintf(buf," 0x%2x ",value);
//                  printf("s5 text: %s\n", buf);
                    break;

                case '7':
//                  sprintf(buf," 0x%2x ",value);
//                  printf("s7 text: %s\n", buf);
                    break;

                case '8':
//                  sprintf(buf," 0x%2x ",value);
//                  printf("s8 text: %s\n", buf);
                    break;

                case '9':
//                  sprintf(buf," 0x%2x ",value);
//                  printf("s9 text: %s\n", buf);
                    break;
            }

            chksum += value;
        }
        /*获取check sum*/
        fread(tmp, sizeof(char), 2, fin);
        value = Ascii2Int(tmp[0], tmp[1]);
        if(value != 0xff - chksum)
            printf("crc sum error! text_value:0x%x, clc_chksum:0x%x\n", value, (0xff - chksum));
        else
            printf("crc sum ok! text_value:0x%x, clc_chksum:0x%x\n", value, (0xff - chksum));
   }
}

3 . 参考代码2

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAX_EXTENSION_SIZE 16
#define MAX_LINE_SIZE 1024
#define MAX_FILE_NAME_SIZE 260
typedef char filetype[MAX_FILE_NAME_SIZE];

typedef struct {
    unsigned int file_size;
    unsigned int start_addr;
    unsigned int end_addr;
    FILE *file_in, *file_out;
} update_file_info, * p_update_file_info;
update_file_info g_update_ecu_file_info;

void get_line(char* str, FILE *in)
{
    char *result;
    result = fgets(str, MAX_LINE_SIZE, in);
    if ((NULL == result) && !feof (in)) 
        printf("Error occurred while reading from file\n");
}

void put_extension(char *file_name, char *extension)
{
    /* location of period in file name */
    char *Period;       
    int ret = -1;

    /*find '.': the last postion*/
    if (NULL != (Period = strrchr(file_name,'.')))
        *(Period) = '\0';

    if (strcmp(extension, Period + 1) == 0)
        ret = 0;

    strcat(file_name, ".");
    strcat(file_name, extension);
}

void s19_to_bin(char *path)
{
    /*保存行内容*/
    char *p_line = NULL;
    char extension[MAX_EXTENSION_SIZE] = {0};
    filetype filename;
    char *p = NULL;
    unsigned char *memory_block = NULL;
    unsigned int memory_block_position;

    /*记录行数*/
    unsigned int record_line = 0; 
    int ret;
    unsigned int i;

    /*行信息*/
    unsigned int type;
    unsigned int data_length;
    unsigned int  address;
    char *p_data = NULL;
    unsigned char check_sum = 0;

    unsigned int temp2;
    unsigned int max_data_length;


    g_update_ecu_file_info.start_addr = (unsigned int)(-1);
    g_update_ecu_file_info.end_addr = 0;

    p_line = (char *)malloc(MAX_LINE_SIZE * sizeof(char));
    if (NULL == p_line) 
        printf("malloc line buffer error. \n");

    p_data = (char *)malloc(MAX_LINE_SIZE * sizeof(char));
    if (NULL == p_data) 
        printf("malloc data buffer error. \n");



    /* default is for binary file extension */
    strncpy(extension, "bin", sizeof(extension));

     /* get filename */
    if (strlen(path) < MAX_FILE_NAME_SIZE) {
        strcpy(filename, path);
    } else {
        printf("filename length exceeds %d characters.\n", MAX_FILE_NAME_SIZE);
    }

    /* Just a normal file name */
    g_update_ecu_file_info.file_in = fopen(filename, "r");

    put_extension(filename, extension);
    g_update_ecu_file_info.file_out = fopen(filename,"wb");

    /*1. calc the size by address*/
    do {
         /* Read a line from input file. */
        get_line(p_line, g_update_ecu_file_info.file_in);
        record_line++;

        i = strlen(p_line); 
        if (--i != 0) {
            if (p_line[i] == '\n') 
                p_line[i] = '\0';

            ret = sscanf(p_line, "S%1x%2x", &type, &data_length);
            if (2 != ret) 
                    printf("Error in line %d of hex file\n", record_line);

//          printf("type:%d, data_length:%d, record_line:%d\n", type, data_length, record_line);

            switch (type) {
                case 0:
                    ret = sscanf(p_line, "S%1x%2x%4x%s",&type, &data_length, &address, p_data);
                    if (4 != ret) 
                        printf("Error in line %d of hex file\n", record_line);
                    break;

                case 1:
                    ret = sscanf(p_line, "S%1x%2x%4x%s",&type, &data_length, &address, p_data);
                    if (4 != ret) 
                        printf("Error in line %d of hex file\n", record_line);

                    printf("address: 0x%x\n", address);

                    if (g_update_ecu_file_info.start_addr > address)
                        g_update_ecu_file_info.start_addr = address;
                    address = address + data_length - 1;
                    if (g_update_ecu_file_info.end_addr < address) 
                        g_update_ecu_file_info.end_addr = address;
                    break;

                case 2:
                    ret = sscanf(p_line, "S%1x%2x%6x%s",&type, &data_length, &address, p_data);
                    if (4 != ret) 
                        printf("Error in line %d of hex file\n", record_line);
                    if (g_update_ecu_file_info.start_addr > address)
                        g_update_ecu_file_info.start_addr = address;
                    address = address + data_length - 1;
                    if (g_update_ecu_file_info.end_addr < address) 
                        g_update_ecu_file_info.end_addr = address;                          
                    break;

                case 3:
                    ret = sscanf(p_line, "S%1x%2x%8x%s",&type, &data_length, &address, p_data);
                    if (4 != ret) 
                        printf("Error in line %d of hex file\n", record_line);  
                    if (g_update_ecu_file_info.start_addr > address)
                        g_update_ecu_file_info.start_addr = address;
                    address = address + data_length - 1;
                    if (g_update_ecu_file_info.end_addr < address) 
                        g_update_ecu_file_info.end_addr = address;
                    break;

                case 5:
                    ret = sscanf(p_line, "S%1x%2x%4x%s",&type, &data_length, &address, p_data);
                    if (4 != ret) 
                        printf("Error in line %d of hex file\n", record_line);
                    break;

                case 7:
                    ret = sscanf(p_line, "S%1x%2x%8x%s",&type, &data_length, &address, p_data);
                    if (4 != ret) 
                        printf("Error in line %d of hex file\n", record_line);  
                    break;

                case 8:
                    ret = sscanf(p_line, "S%1x%2x%6x%s",&type, &data_length, &address, p_data);
                    if (4 != ret) 
                        printf("Error in line %d of hex file\n", record_line);  
                    break;

                case 9:
                    ret = sscanf(p_line, "S%1x%2x%4x%s",&type, &data_length, &address, p_data);
                    if (4 != ret) 
                        printf("Error in line %d of hex file\n", record_line);          
                    break;

                default:
                    break;              
            }
        }
    }  while (!feof(g_update_ecu_file_info.file_in));

    /*calc the data size*/
    max_data_length = g_update_ecu_file_info.end_addr - g_update_ecu_file_info.start_addr + 1;
    g_update_ecu_file_info.file_size = max_data_length;

    printf("start addr:0x%08x\n", g_update_ecu_file_info.start_addr);
    printf("end addr:0x%08x\n", g_update_ecu_file_info.end_addr);
    printf("data size: %d Bytes\n", g_update_ecu_file_info.file_size);  

    memory_block = (unsigned char *)malloc(max_data_length * sizeof(unsigned char));
    if (NULL == memory_block) 
        printf("malloc memory_block buffer error. \n");
    memset (memory_block, 0xFF, max_data_length);


    /*****************2. deal with data***********************/
    record_line = 0;
    /*init file inner pointer*/
    rewind(g_update_ecu_file_info.file_in);

    /* Read the file & process the lines. */
    /* repeat until EOF(Filin) */
    do {
         /* Read a line from input file. */
        get_line(p_line, g_update_ecu_file_info.file_in);
        record_line++;

        i = strlen(p_line); 
        if (--i != 0) {
            if (p_line[i] == '\n') 
                p_line[i] = '\0';

            ret = sscanf(p_line, "S%1x%2x", &type, &data_length);
            if (2 != ret) 
                    printf("Error in line %d of hex file\n", record_line);

//          printf("type:%d, data_length:%d, record_line:%d\n", type, data_length, record_line);

            switch (type) {
                case 0:
                    ret = sscanf(p_line, "S%1x%2x%4x%s",&type, &data_length, &address, p_data);
                    if (4 != ret) 
                        printf("Error in line %d of hex file\n", record_line);
                    check_sum = data_length + (address >> 8) + (address & 0xff);
                    break;

                case 1:
                    ret = sscanf(p_line, "S%1x%2x%4x%s",&type, &data_length, &address, p_data);
                    if (4 != ret) 
                        printf("Error in line %d of hex file\n", record_line);
                    check_sum = data_length + (address >> 8) + (address & 0xff);

                    printf("type:%d, data_length:0x%x, address: 0x%x, record_line:%d \n", type, data_length, address, record_line);                 
                    printf("p_data: %s\n", p_data);

                    /*行内容:data段的起始位置*/
                    p = (char *)p_data;
                    /*计算相对于最低位置的地址*/
                    memory_block_position = address - g_update_ecu_file_info.start_addr;
                    /*开始存储数据*/
                    if (memory_block_position < g_update_ecu_file_info.file_size) {
                        /*save data*/
                        data_length = data_length - 3;
                        do {
                            ret = sscanf(p, "%2x", &temp2);
                            if (1 != ret) 
                                printf("ReadDataBytes: error in line %d of hex file\n", record_line);
                            p += 2;

                            memory_block[memory_block_position++] = temp2;

                            check_sum = (check_sum + temp2) & 0xFF;
                        } while (--data_length != 0);
                    } else
                        printf("Overlapped record detected\n");

                     /* Read the Checksum value. */
                    ret = sscanf(p, "%2x",&temp2);
                    if (1 != ret) 
                        printf("Error in line %d of hex file\n", record_line);

                    /* Verify Checksum value. */
                    if(temp2 != 0xff - check_sum)
                        printf("crc sum error! text_value:0x%x, clc_chksum:0x%x\n", temp2, (0xff - check_sum));
                    break;

                case 2:
                    ret = sscanf(p_line, "S%1x%2x%6x%s",&type, &data_length, &address, p_data);
                    if (4 != ret) 
                        printf("Error in line %d of hex file\n", record_line);
                    check_sum = data_length + (address >> 16) + 
                                ((address >> 8)&0xff) + (address & 0xff);   

                    /*行内容:data段的起始位置*/
                    p = (char *)p_data;
                    /*计算相对于最低位置的地址*/
                    memory_block_position = address - g_update_ecu_file_info.start_addr;

                    /*开始存储数据*/
                    if (memory_block_position < g_update_ecu_file_info.file_size) {
                        /*save data*/
                        data_length = data_length - 4;
                        do {
                            ret = sscanf(p, "%2x", &temp2);
                            if (1 != ret) 
                                printf("ReadDataBytes: error in line %d of hex file\n", record_line);
                            p += 2;

                            memory_block[memory_block_position++] = temp2;

                            check_sum = (check_sum + temp2) & 0xFF;
                        } while (--data_length != 0);
                    } else
                        printf("Overlapped record detected\n");

                     /* Read the Checksum value. */
                    ret = sscanf(p, "%2x",&temp2);
                    if (1 != ret) 
                        printf("Error in line %d of hex file\n", record_line);

                    /* Verify Checksum value. */
                    if(temp2 != 0xff - check_sum)
                        printf("crc sum error! text_value:0x%x, clc_chksum:0x%x\n", temp2, (0xff - check_sum));

                    break;

                case 3:
                    ret = sscanf(p_line, "S%1x%2x%8x%s",&type, &data_length, &address, p_data);
                    if (4 != ret) 
                        printf("Error in line %d of hex file\n", record_line);  
                    check_sum = data_length + (address >> 24) + 
                                ((address >> 16) & 0xff) + ((address >> 8)&0xff) + 
                                (address & 0xff);

                    /*行内容:data段的起始位置*/
                    p = (char *)p_data;
                    /*计算相对于最低位置的地址*/
                    memory_block_position = address - g_update_ecu_file_info.start_addr;

                    /*开始存储数据*/
                    if (memory_block_position < g_update_ecu_file_info.file_size) {
                        /*save data*/
                        data_length = data_length - 5;
                        do {
                            ret = sscanf(p, "%2x", &temp2);
                            if (1 != ret) 
                                printf("ReadDataBytes: error in line %d of hex file\n", record_line);
                            p += 2;

                            memory_block[memory_block_position++] = temp2;

                            check_sum = (check_sum + temp2) & 0xFF;
                        } while (--data_length != 0);
                    } else
                        printf("Overlapped record detected\n");

                     /* Read the Checksum value. */
                    ret = sscanf(p, "%2x",&temp2);
                    if (1 != ret) 
                        printf("Error in line %d of hex file\n", record_line);

                    /* Verify Checksum value. */
                    if(temp2 != 0xff - check_sum)
                        printf("crc sum error! text_value:0x%x, clc_chksum:0x%x\n", temp2, (0xff - check_sum));
                    break;

                case 5:
                    ret = sscanf(p_line, "S%1x%2x%4x%s",&type, &data_length, &address, p_data);
                    if (4 != ret) 
                        printf("Error in line %d of hex file\n", record_line);
                    check_sum = data_length + (address >> 8) + (address & 0xff);
                    break;

                case 7:
                    ret = sscanf(p_line, "S%1x%2x%8x%s",&type, &data_length, &address, p_data);
                    if (4 != ret) 
                        printf("Error in line %d of hex file\n", record_line);  
                    check_sum = data_length + (address >> 24) + 
                                ((address >> 16) & 0xff) + ((address >> 8)&0xff) + 
                                (address & 0xff);               
                    break;

                case 8:
                    ret = sscanf(p_line, "S%1x%2x%6x%s",&type, &data_length, &address, p_data);
                    if (4 != ret) 
                        printf("Error in line %d of hex file\n", record_line);  
                    check_sum = data_length + (address >> 16) + 
                                ((address >> 8)&0xff) + (address & 0xff);
                    break;

                case 9:
                    ret = sscanf(p_line, "S%1x%2x%4x%s",&type, &data_length, &address, p_data);
                    if (4 != ret) 
                        printf("Error in line %d of hex file\n", record_line);          
                    check_sum = data_length + (address >> 8) + (address & 0xff);
                    break;

                default:
                    break;              
            }
        }

    }while (!feof(g_update_ecu_file_info.file_in));


    /*write binary file*/
    fwrite (memory_block, g_update_ecu_file_info.file_size, 1, g_update_ecu_file_info.file_out);
    fflush(g_update_ecu_file_info.file_out);


    fclose(g_update_ecu_file_info.file_in);
    fclose(g_update_ecu_file_info.file_out);

    free(memory_block);
    memory_block = NULL;

    free(p_line);
    p_line = NULL;

    free(p_data);
    p_data = NULL;
}

int main(int argc, char *argv[])
{
    s19_to_bin(argv[argc-1]);
    return 0;
}



  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值