一步一步實現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);//關閉文件
}