00> <info> app: Reading: data.csv...
00>
00> <info> app: data.csv sucessfully opened!
00>
00> <info> app: File size: 37876 bytes
00>
00> <info> app: File successfully read!
00>
00> <info> app: 0 bytes read
Я пытаюсь прочитать CSV-файл, в который можно писать в моем Nordic NRF52840. Тип файла - CSV. Сам файл представляет собой просто значение идентификатора с некоторыми значениями датчиков / данных рядом с ним.
Я также хочу иметь возможность читать этот файл. Предпочтительно чтение строки на основе значения идентификатора. Но у меня вообще проблема с чтением данных. В моем терминале я вижу, что файл существует, и он имеет размер, найденный моей функцией чтения. Однако когда я пытаюсь прочитать файл. Считается 0 байтов.
Ниже мой код для чтения CSV, любые советы были бы большой благодарностью.
void SD_CARD_Read()
{
uint16_t size;
UINT bytesRead;//From sd card driver library
while (fno.fname[0]);
ff_result = f_open(&file, FILE_NAME, FA_READ | FA_WRITE | FA_OPEN_APPEND);
if(ff_result != FR_OK)//Not passing if the file is missing
{
if (ff_result != FR_OK)
{
NRF_LOG_INFO("Unable to open or create file: " FILE_NAME ".");
SD_CARD_PRESENT = 0;
return;
}
}
else//File was openned fine
{
NRF_LOG_RAW_INFO("");
NRF_LOG_INFO("Reading: " FILE_NAME "...");
NRF_LOG_INFO(FILE_NAME" sucessfully opened!");
size = f_size(&file);
char * data = NULL;
data = malloc(size); /* allocate memory to store image data */
NRF_LOG_INFO("File size: %d bytes", size);
ff_result = f_read(&file, data, (UINT) size, &bytesRead);
if (ff_result == FR_OK){
NRF_LOG_INFO("File successfully read!");
NRF_LOG_INFO("%d bytes read", bytesRead);
for (int i=0; i < bytesRead; i++)
{
NRF_LOG_INFO("data[%d]: 0x%x", i, data[i]);
}
}
free(data); // free allocated memory when you don't need it
}
(void) f_close(&file);
return;
}
This is the output of my terminal. As you can see it identifies a file called data.csv and its size but, does not read any data.
00> <info> app: Reading: data.csv...
00>
00> <info> app: data.csv sucessfully opened!
00>
00> <info> app: File size: 37876 bytes
00>
00> <info> app: File successfully read!
00>
00> <info> app: 0 bytes read
Насколько я понимаю, код f_read устанавливает bytesRead равным 0. Я открываю файл с помощью FA_OPEN_APPEND. Ниже приведены параметры SDK для передачи в функцию чтения:
FRESULT f_read (
FIL* fp, /* Pointer to the file object */
void* buff, /* Pointer to data buffer */
UINT btr, /* Number of bytes to read */
UINT* br /* Pointer to number of bytes read */
)
f_size
возвращает ожидаемый размер, ноf_read
помещает 0 вbytesRead
? Я не знаю никаких подробностей о библиотеке SD-карт, но я предполагаю, что если вы используетеf_open
сFA_OPEN_APPEND
, текущая позиция для чтения / записи файла находится в конце файла, и вы не можете читать какие-либо данные из этой позиции. Я предлагаю опуститьFA_OPEN_APPEND
и, возможно, такжеFA_WRITE
. Или, может быть, есть что-то вродеlseek
илиfseek
, которое можно использовать для перемещения указателя в начало файла. - person Bodo   schedule 02.03.2020FA_OPEN_APPEND
иFA_WRITE
, если хотите только прочитать файл? - person Bodo   schedule 02.03.2020