我想在stm32中实现FOTA,因为我在gcc编译器中阅读. bin文件,并将数据串行发送到uart。但读取的文件与实际文件不匹配。我对比数据,发现fread函数没有读取正确的数据。然后我打印了200字节的数据,并与online .bin到hex转换器和stm32编程器进行了比较,我发现fread函数存在问题。但是我怎么会不知道呢。下面是代码。
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#endif
uint8_t DATA_BUF[1024];
uint8_t APP_BIN[80000];
int main(int argc, char *argv[])
{
int comport;
int bdrate = 115200; /* 115200 baud */
char mode[]={'8','N','1',0}; /* *-bits, No parity, 1 stop bit */
char bin_name[1024];
int ex = 0;
FILE *Fptr = NULL;
do
{
if( argc <= 2 )
{
printf("Please feed the COM PORT number and the Application Image....!!!\n");
printf("Example: .\\etx_ota_app.exe 8 ..\\..\\Application\\Debug\\Blinky.bin");
ex = -1;
break;
}
//get the COM port Number
comport = atoi(argv[1]) -1;
strcpy(bin_name, argv[2]);
// ex = sizeof(ETX_OTA_HEADER_);
// printf("Opening COM%d...\n", ex );
printf("Opening COM%d...\n", comport+1 );
//if( RS232_OpenComport(comport, bdrate, mode, 0) )
//{
// printf("Can not open comport\n");
// ex = -1;
// break;
//}
//send OTA Start command
//ex = send_ota_start(comport);
//if( ex < 0 )
//{
// printf("send_ota_start Err\n");
// break;
//}
printf("Opening Binary file : %s\n", bin_name);
Fptr = fopen(bin_name,"rb");
if( Fptr == NULL )
{
printf("Can not open %s\n", bin_name);
ex = -1;
break;
}
fseek(Fptr, 0L, SEEK_END);
uint32_t app_size = ftell(Fptr);
fseek(Fptr, 0L, SEEK_SET);
printf("File size = %d\n", app_size);
//Send OTA Header
//meta_info ota_info;
//ota_info.package_size = app_size;
//ota_info.package_crc = 0; //TODO: Add CRC
//ex = send_ota_header( comport, &ota_info );
//if( ex < 0 )
//{
// printf("send_ota_header Err\n");
// break;
//}
//read the full image
if(fread( APP_BIN, 1, app_size, Fptr ) != app_size )
{
printf("App/FW read Error\n");
ex = -1;
break;
}
for(uint32_t i = 0; i < 200; i++)
{
printf("%d ",APP_BIN[i]);
}
} while (false);
return(ex);
}
这一个是原始数据时,我使用online .bin到十六进制转换器
0x00, 0x00, 0x08, 0x24, 0xA1, 0x0D, 0x10, 0x08, 0xED, 0x0A, 0x10, 0x08, 0xF3, 0x0A, 0x10, 0x08,
这是使用fread函数时的数据
0x00, 0x00, 0x08, 0x24, 0x4D, 0x0C, 0x10, 0x08, 0x99, 0x09, 0x10, 0x08, 0x9F, 0x09, 0x10, 0x08,
我找不出是什么问题。如果有人已经面临同样的问题,请引导我谢谢你。
1条答案
按热度按时间ccrfmcuu1#
使用
fseek
和ftell
来确定文件的大小是一种反模式。这不是必需的。下面是一种更正确的读取文件二进制内容的方法。以下是跑步记录:
现在与Linux十六进制转储进行比较: