在gcc编译器中阅读.bin文件时数据不匹配

blmhpbnm  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(161)

我想在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,

我找不出是什么问题。如果有人已经面临同样的问题,请引导我谢谢你。

ccrfmcuu

ccrfmcuu1#

使用fseekftell来确定文件的大小是一种反模式。这不是必需的。下面是一种更正确的读取文件二进制内容的方法。

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

struct bytes_s {
  uint8_t *buf;
  size_t size;
};

/* Read file contents as unsigned bytes. */
struct bytes_s read_bytes(FILE *f) {
  size_t buf_size = 1024, size = 0;
  uint8_t *buf = malloc(buf_size * sizeof *buf);
  for (;;) {
    size_t read_size = fread(buf + size, 1, buf_size - size, f);
    if (read_size == 0) break;
    size += read_size;
    buf_size *= 2;
    buf = realloc(buf, buf_size * sizeof *buf);
  }
  return (struct bytes_s) { .buf = realloc(buf, size), .size = size };
}

int main(int argc, char **argv) {
  if (argc < 2) exit(1);
  FILE *f = fopen(argv[1], "rb");
  if (!f) exit(2);
  struct bytes_s bytes = read_bytes(f);
  for (size_t i = 0; i < bytes.size; ++i) {
    printf("%02x ", bytes.buf[i]);
    if ((i & 0xf) == 0xf) putchar('\n');
  }
  putchar('\n');
  return 0;
}

以下是跑步记录:

$ gcc rb.c -o rb
$ ./rb rb.c
23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 
68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 
6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 
3c 73 74 64 69 6e 74 2e 68 3e 0a 0a 73 74 72 75 
63 74 20 62 79 74 65 73 5f 73 20 7b 0a 20 20 75 
[ rest elided ]

现在与Linux十六进制转储进行比较:

$ hexdump -C rb.c
00000000  23 69 6e 63 6c 75 64 65  20 3c 73 74 64 69 6f 2e  |#include <stdio.|
00000010  68 3e 0a 23 69 6e 63 6c  75 64 65 20 3c 73 74 64  |h>.#include <std|
00000020  6c 69 62 2e 68 3e 0a 23  69 6e 63 6c 75 64 65 20  |lib.h>.#include |
00000030  3c 73 74 64 69 6e 74 2e  68 3e 0a 0a 73 74 72 75  |<stdint.h>..stru|
00000040  63 74 20 62 79 74 65 73  5f 73 20 7b 0a 20 20 75  |ct bytes_s {.  u|
[ rest elided ]

相关问题