一步一步實現STM32-FOTA系列教程之BIN文件解包C語言實現

一步一步實現STM32-FOTA系列教程之BIN文件解包

文章系列鏈接

1、《一步一步實現STM32-FOTA系列教程之bin文件生成》

2、《一步一步實現STM32-FOTA系列教程之STM32-FLASH分區說明》

3、《一步一步實現STM32-FOTA系列教程之FLASH靜態區讀寫》
4、《一步一步實現STM32-FOTA系列教程之Bootloader編寫》
5、《一步一步實現STM32-FOTA系列教程之BIN文件解包》

前言

上篇文章對BIN文件解包原理進行了說明。本篇文章就根據上篇文章的原理,在Linux進行實現。

C語言實現

話不多說,直接上代碼。

    /*
     *  binread.h
    */
    #ifndef __OTAFIRMWARE_READ_H__
    #define __OTAFIRMWARE_READ_H__
    
    #include<stdio.h>
    #include<stdlib.h>
    #include <string.h>
    
    #define FRAMEDATAMAXLEN 512   //幀數據有效位最大長度
    
    
    
    //定義 OTA 固件升級參數結構體
    
    typedef struct 
    {
    	unsigned int BinSizeBytes;//二進制文件總大小
    	unsigned int FrameNum;//幀數量
    	unsigned int FrameSequence;   //幀序列
    	unsigned int TailFrameDataSize;   //最後一幀數據有效位長度
    }OTAFirmware_Params;
    
    
    extern OTAFirmware_Params ota_params;
    extern char txbinbuffer[512];
    
    void ReadOtaParams(const char *otafilename,OTAFirmware_Params *otafirmparams);
    void GetFirmwareData(const char *otafilename,OTAFirmware_Params *otafirmparams);
    void SetFrameSequence(OTAFirmware_Params *otafirmparams,int num);
    
    #endif
    /*
     *  binread.c
    */
 #include "binread.h"
    
    #define MALLOC_SIZE 16
    
    
    OTAFirmware_Params ota_params;
    
    char txbinbuffer[512]; //發送緩衝區
    
    
    void print_hex_data(char *buffer,int buf_len)
    {
    	int i;
    	if(buffer==NULL)
    		return;
    	printf("--------------------HEXDATA-----------------------\n");
    	for(i=0;i<buf_len;i++)
    	{
    		printf("%02X ",buffer[i]);
    	}
    	printf("\n");
    	printf("------------------------------------------------------\n");
    }
    
    
    
    //讀取OTA固件參數信息 將參數保存在 OTAFirmware_Params 結構體中
    void ReadOtaParams(const char *otafilename,OTAFirmware_Params *otafirmparams)
    {
    	FILE *pfile;
    	unsigned int filesize;
    	
    	if(otafilename == NULL)
    	{
    		printf("[ERR] ota file name err\r\n");
    		return;
    	}
    	if(otafirmparams == NULL)
    	{
    		printf("[ERR] otafirmparams err\r\n");
    		return;
    	}
    	pfile = fopen(otafilename,"rb");//打開文件
    	fseek(pfile,0,SEEK_END);
    	filesize = ftell(pfile); 
    	fclose(pfile); //關閉文件
    	
    	memset(otafirmparams,0,sizeof(OTAFirmware_Params));
    	
    	otafirmparams->BinSizeBytes = filesize;
    	otafirmparams->FrameNum = filesize/FRAMEDATAMAXLEN;
    	otafirmparams->TailFrameDataSize =  filesize%FRAMEDATAMAXLEN;
    	if(otafirmparams->TailFrameDataSize>0)
    	{
    		otafirmparams->FrameNum =otafirmparams->FrameNum +1;
    	}
    	printf("otafirmparams->BinSizeBytes  :%d\r\n",otafirmparams->BinSizeBytes);
    	printf("otafirmparams->FrameNum  :%d\r\n",otafirmparams->FrameNum);
    	printf("otafirmparams->FrameSequence :%d\r\n",otafirmparams->FrameSequence);
    	printf("otafirmparams->TailFrameDataSize :%d\r\n",otafirmparams->TailFrameDataSize);
    	
    }
    
    
    void SetFrameSequence(OTAFirmware_Params *otafirmparams,int num)
    {
    	if(otafirmparams == NULL)
    	{
    		printf("[ERR] otafirmparams err\r\n");
    		return;
    	}
    	otafirmparams->FrameSequence = num;
    }
    
    // 從BIN文件中讀取一幀數據 
    void GetFirmwareData(const char *otafilename,OTAFirmware_Params *otafirmparams)
    {
    	FILE *pfile;
    	int readsizestart;
    	if(otafilename == NULL)
    	{
    		printf("[ERR] ota file name err\r\n");
    		return;
    	}
    	if(otafirmparams == NULL)
    	{
    		printf("[ERR] otafirmparams err\r\n");
    		return;
    	}
    	memset(txbinbuffer,0,512);
    
    	
    	pfile = fopen(otafilename,"rb");//打開文件
    	fseek(pfile,0,SEEK_SET);
    	
    	if(otafirmparams->FrameSequence < (otafirmparams->FrameNum-1))
    	{
    		readsizestart = otafirmparams->FrameSequence *512;
    		fseek(pfile,readsizestart,SEEK_SET);//將指針偏移 readsizestart 個字節
    		fread(txbinbuffer,1,FRAMEDATAMAXLEN,pfile);
    		printf("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\r\n");
    		printf("otafirmparams->FrameSequence %d\r\n",otafirmparams->FrameSequence);
    printf("Data Len %d\r\n",FRAMEDATAMAXLEN);
    		printf("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\r\n");
    		print_hex_data(txbinbuffer,FRAMEDATAMAXLEN);
    		otafirmparams->FrameSequence =otafirmparams->FrameSequence+1;
    	}
    	else if(otafirmparams->FrameSequence == (otafirmparams->FrameNum-1))
    	{
    		readsizestart = otafirmparams->FrameSequence *512;
    		fseek(pfile,readsizestart,SEEK_SET);//將指針偏移 readsizestart 個字節
    		fread(txbinbuffer,1,otafirmparams->TailFrameDataSize,pfile);
    		printf("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\r\n");
    		printf("otafirmparams->FrameSequence %d\r\n",otafirmparams->FrameSequence);
    printf("Data Len %d\r\n",otafirmparams->TailFrameDataSize);
    		printf("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\r\n");
    		print_hex_data(txbinbuffer,otafirmparams->TailFrameDataSize);
    		otafirmparams->FrameSequence =otafirmparams->FrameSequence+1;
    	}
    	
    	fclose(pfile);//關閉文件
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章