Скопируйте двоичный файл 32 байта на 32 байта
То, что я пытаюсь сделать здесь, это скопировать двоичный файл 32 байта на 32 байта. ПОЧЕМУ я пытаюсь это сделать? потому что мне нужно отправить этот двоичный файл на USART моей доски. Я не могу отправить его за один раз, поэтому я отправляю 32 байта на 32 байта.
Сначала я пытаюсь прочитать мой двоичный файл в буфер и записать его в другой файл по 3 байта на 32 байта. Проблема в том, что когда я пытаюсь выполнить новый бинарный файл, который я создал... он не выполняется на плате, и я не понимаю, почему
вот мой код, если вы хотите попробовать..
int sendBuff(char *buffer,int *size)
{
int i,n =0;
char c ;
FILE *file,target;
//Open file
file = fopen("Nucleo-L152RE_bis.bin", "rb");
if (!file)
{
fprintf(stderr, "Unable to open file %s", "Nucleo-L152RE_bis.hex");
return 0;
}
*size = getFileSize(file);
if (!buffer) {
fprintf(stderr, "Memory error!");
fclose(file);
return 0;
}
//Read file contents into buffer
fread(buffer,*size, 1, file);
fclose(file);
return 0;
}
void writefile(unsigned char *buffer,int size){
FILE *file;
int i;
file = fopen("salut.bin", "a");
if (!file)
{
fprintf(stderr, "Unable to open file %s", "Nucleo-L152RE.bin");
}
else
{
fwrite(buffer,sizeof(unsigned char),size,file);
fclose(file);
}
}
и основная функция:
int main()
{
/* variables locales */
unsigned char bufferS[1000000];
int nId = 5, nChoice, nBytesWritten, nBytesRead;
int* pByteRead, pByteWritten;
int size;
int k = 0,k_hexa = 0;
/* demande du numéro du port COM */
/* boucle tant que l'on ne quitte pas */
do
{
/* menu */
//ecriture de l'executable dans un buffer
sendBuff(bufferS, &size);
printf("size of file: %d\n\n", size);
k = 0;
printf("SIZE : %d\n", size);
//send program
do
{
printf("Envoi de donnees...\r\n");
//WriteCOM(bufferS + k, 32, &nBytesWritten);
writefile(bufferS+k,32);
printf("%d octet(s) envoye(s) et k : %d .\r\n",
nBytesWritten, k);
k += 32;
// scanf("%d",&nChoice);
} while (k < size);
}
}
2 ответа
1) В соответствии с вашей реализациейвы добавляете дополнительные (32% размера 32) избыточные байты в новый salut.bin, что приводит к сбою выполнения. Копия будет в порядке так же,
do
{
printf("Envoi de donnees...\r\n");
//WriteCOM(bufferS + k, 32, &nBytesWritten);
writefile(bufferS+k,32);
printf("%d octet(s) envoye(s) et k : %d .\r\n",
nBytesWritten, k);
k += 32;
// scanf("%d",&nChoice);
} while (k < size-32);
writefile(bufferS+k, size%32);
2) Неправильный формат или содержимое корзины приведет к execute failure
иногда это вызвано отсутствием некоторых байтов или добавлением лишних байтов в конец файла случайно.
Должны ли мы ссылаться на код, который вы опубликовали как есть? В этом случае вы, кажется, вызываете неопределенное поведение, потому что вы пытаетесь прочитать значение nBytesWritten
внутри printf
, Но nBytesWritten
не похоже на инициализацию.