Скопируйте двоичный файл 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 не похоже на инициализацию.

Другие вопросы по тегам