通过 NRF52840 读取 CSV 文件
Reading a CSV file via 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。文件本身只是一个 ID 值,旁边有一些传感器/数据值。
我也希望能够阅读该文件。最好根据 ID 值读取一行。但是我根本无法读取数据。在我的终端中,我可以看到该文件存在,并且它具有从我的读取功能中找到的文件大小。但是,当我尝试读取文件时。它读取了 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;
}
这是我终端的输出。如您所见,它标识了一个名为 data.csv 的文件及其大小,但不读取任何数据。
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 */
)
这个答案是一个猜测,因为我不知道任何关于SD卡库的细节。
也许库没有单独的指针来读取和写入(附加到)文件。如果 FA_OPEN_APPEND
将位置设置为文件末尾,则 f_read
不会从该位置获取任何数据。
尝试在没有 FA_OPEN_APPEND
甚至没有 FA_WRITE
的情况下使用 f_open
。
ff_result = f_open(&file, FILE_NAME, FA_READ);
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。文件本身只是一个 ID 值,旁边有一些传感器/数据值。
我也希望能够阅读该文件。最好根据 ID 值读取一行。但是我根本无法读取数据。在我的终端中,我可以看到该文件存在,并且它具有从我的读取功能中找到的文件大小。但是,当我尝试读取文件时。它读取了 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;
}
这是我终端的输出。如您所见,它标识了一个名为 data.csv 的文件及其大小,但不读取任何数据。
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 */
)
这个答案是一个猜测,因为我不知道任何关于SD卡库的细节。
也许库没有单独的指针来读取和写入(附加到)文件。如果 FA_OPEN_APPEND
将位置设置为文件末尾,则 f_read
不会从该位置获取任何数据。
尝试在没有 FA_OPEN_APPEND
甚至没有 FA_WRITE
的情况下使用 f_open
。
ff_result = f_open(&file, FILE_NAME, FA_READ);