【发布时间】:2015-06-18 09:23:19
【问题描述】:
我在这里尝试做的是每 32 个字节复制一个 32 个字节的二进制文件。 我为什么要这样做?因为我需要在我的主板的 USART 上发送这个二进制文件。我不能一次性发送,所以我每 32 个字节发送 32 个字节。
首先,我尝试将我的二进制文件读入缓冲区,然后将其写入另一个文件,每 32 个字节 3 个字节。 问题是,当我尝试执行我制作的新二进制文件时..它没有在板上执行,我不明白为什么
如果你想尝试一下,这是我的代码..
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);
}
}
【问题讨论】:
-
在 Windows 上吗?如果是,你不应该在 fopen 中使用“ab”而不是“a”吗?
-
还有其他一些可能或可能不相关的缺陷:您确定文件大小是 32 的倍数吗?不应该动态分配bufferS吗? (顺便说一句,你当然可以在没有缓冲区的情况下工作)
-
顺便说一句,您通常应该使用比 32 字节大得多的缓冲区。使用 8192 字节的缓冲区应该更明智!
-
我发现你将函数命名为 sendBuff 而实际上它是读取的有点令人困惑。您还应该检查 fread 的返回值,以确保您确实获得了预期的字节数 (
bytesRead = fread(buffer,1,*size,fp)) -
一般来说,你应该检查运行时函数的返回值,尤其是关于 I/O