can通信传输bz2文件损坏解决方法
需求:
利用can传输文本文件,但是传输压缩包文件会显示文件损坏
can通信每次传输8个字节数据
原因:
代码中使用fgets打开文件进行读取传输,fgets适合传输文本信息,读取二进制数据有的字符无法读到,故接收端文件损坏。
解决:
打开文件采用fread函数即可读取二进制,又可读取文本。
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>int main(int argc, char* argv[]){FILE* fp[3];char buf[256];size_t bytes_read;size_t size;size_t offset;uint32_t count;char* pbuf = NULL;if(argc < 2){ // 需要两个参数printf("input parameter is less than 2\r\n");return -1;}fp[1] = fopen(argv[1], "rb"); // 二进制形式读取fp[2] = fopen(argv[2], "wb"); // 二进制形式写入if(fp[1] == NULL || fp[2] == NULL){printf("file open error\r\n");return -1;}while((bytes_read = fread(buf, 1, sizeof(buf), fp[1])) > 0){ // fread函数二进制形式读取,每次读取一字节,一共读取256字节/*模拟can通信传输:一次传输8字节*/size = bytes_read;offset = size % 8;count = size / 8 + (offset > 0 ? 1 : 0);pbuf = buf;for(int i = 0; i < count; i ++){if(size - i * 8 >= 8){ // 发送大于fwrite(pbuf, 1, 8, fp[2]); // 和can通信一样一次传输8字节}else{fwrite(pbuf, 1, size - i * 8, fp[2]);}pbuf += 8;}}printf("cp %s to %s end\r\n", argv[1], argv[2]);return 0;
}
测试: