Чтение файла CSV через NRF52840

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 */
)


person Thomas Morris    schedule 02.03.2020    source источник
comment
Пожалуйста, отредактируйте свой вопрос и добавьте дополнительные сведения. Скопируйте и вставьте вывод программы. Вы хотите сказать, что f_size возвращает ожидаемый размер, но f_read помещает 0 в bytesRead? Я не знаю никаких подробностей о библиотеке SD-карт, но я предполагаю, что если вы используете f_open с FA_OPEN_APPEND, текущая позиция для чтения / записи файла находится в конце файла, и вы не можете читать какие-либо данные из этой позиции. Я предлагаю опустить FA_OPEN_APPEND и, возможно, также FA_WRITE. Или, может быть, есть что-то вроде lseek или fseek, которое можно использовать для перемещения указателя в начало файла.   -  person Bodo    schedule 02.03.2020
comment
Я добавил больше деталей в свой пост, чтобы включить вывод терминала и информацию sdk о том, как использовать функцию. К сожалению, я не могу найти в Интернете примеров того, как использовать функцию чтения для этого api. Предполагается, что функция считывает количество байтов, найденных через f_size. Я знаю, что функция работает нормально, так как ошибок не возникает.   -  person Thomas Morris    schedule 02.03.2020
comment
Почему вы используете FA_OPEN_APPEND и FA_WRITE, если хотите только прочитать файл?   -  person Bodo    schedule 02.03.2020
comment
@Bodo, это хороший аргумент. Я просто изменил его на FA_READ only. Я смотрел пример, который открывается для чтения, и в нем используются FA_OPEN_APPEND, FA_WRITE и FA_READ. Так что я предположил, что это сработает. Но я удалил остальные и просто использовал FA_READ, и теперь он читает байты. Спасибо, не стесняйтесь предлагать это в качестве ответа и я не принимаю его. Спасибо   -  person Thomas Morris    schedule 02.03.2020


Ответы (1)


Этот ответ является предположением, потому что я не знаю подробностей о библиотеке SD-карт.

Возможно, в библиотеке нет отдельных указателей для чтения и записи (добавления) файла. Если FA_OPEN_APPEND устанавливает позицию в конец файла, можно ожидать, что f_read не получит никаких данных из этой позиции.

Попробуйте использовать f_open без FA_OPEN_APPEND, а может и без FA_WRITE.

ff_result = f_open(&file, FILE_NAME, FA_READ);
person Bodo    schedule 02.03.2020