Tôi đang đọc một tệp từ SPI Flash với hệ thống tệp FATFS, trên nền tảng STM32F103 chạy FreeRTOS. Tôi có thể đọc thành công Tệp có kích thước nhỏ hơn 2048, nhưng nếu đọc tệp tệp có kích thước lớn hơn 2048, (Khi tôi đang đọc trong các đoạn 128 byte), nó chỉ đọc tối đa 2048 byte và f_read trả về lỗi 'FR_INT_ERR' khi Tệp con trỏ di chuyển đến vị trí trên 2048 byte.
Dưới đây trong mã của tôi để đọc thử viết. f_size được hiển thị kích thước tập tin chính xác. Nhưng khi tôi đọc, nó báo lỗi, Nếu tôi thực sự chạy vòng lặp cho đến hết tệp để đọc dữ liệu, nó luôn trả về đoạn cuối cùng trước 2048 byte lặp đi lặp lại.
FRESULT xRes;
FIL xFile;
const char cWBuffer[] = "Hello FAT World! 0123456789abcdef";
char cRBuffer[128]
xRes = f_mount(0, &s_xVolume);
printf("\r\n mount result %d successful!",xRes);
#ifdef FAT_MAKEFS_TEST
// this delay is to prevent the FAT corruption after a systenm reset.
Delay_us( 200 );
printf("\r\n MAKE FS Test");
printf("\r\n format the ext FLASH");
printf("\r\n please wait...");
xRes = f_mkfs(0, SFD_FORMAT, 4096 *10 );
printf("\r\n Format result : %d ",xRes);
assert(xRes == FR_OK);
#endif
#ifdef FAT_WRITE_TEST
Delay_us( 1000 );
printf("\r\n WRITE Test");
printf("\r\n open file: W+CA");
xRes = f_open(&xFile, filename, FA_WRITE|FA_CREATE_ALWAYS);
printf("\r\n Open result : %d ",xRes);
assert(xRes == FR_OK);
printf("\r\n write file");
for(i=0;i<1024;i++)
{
xRes = f_write(&xFile, cWBuffer, strlen(cWBuffer), &n);
//printf("\r\n Write result : %d, bytes = %d ",xRes,n);
assert(xRes == FR_OK);
//assert(n == strlen(cWBuffer));
}
printf("\r\n close file");
xRes = f_close(&xFile);
assert(xRes == FR_OK);
#endif
#ifdef FAT_READ_TEST
Delay_us( 100 );
printf("\r\n READ Test");
printf("\r\n open file: R+OE");
xRes = f_open(&xFile, filename, FA_READ|FA_OPEN_EXISTING);
printf("\r\n Open result : %d ",xRes);
assert(xRes == FR_OK);
fs = f_size(&xFile);
printf("\r\n read file size = %d",fs);
i=0;
fs = f_size(&xFile);
while(i<fs)
{
xRes = f_read(&xFile, cRBuffer, sizeof(cRBuffer), &m);
printf("\r\n Read result : %d, bytes read = %d, i =%d ",xRes,m,tread);
tread += m;
assert(xRes == FR_OK);
//assert(m == strlen(cWBuffer));
}
printf("\r\n Total bytes read = %d",tread);
printf("\r\n close file");
printf("\r\n file content:");
printf("%s :\n",cRBuffer);
xRes = f_close(&xFile);
assert(xRes == FR_OK);
#endif
printf("\r\n test success!!!");