如何避免因大写而损坏SD卡?

好的,首先是一些背景知识,以帮助我澄清问题:

我正在研究一种从传感器收集某些数据并使用GSM调制解调器将它们发布到服务器的设备.由于GSM连接不是100%可靠,它将包含一个记录机制,可以将未发送的数据写入SD卡.

我们正在使用Chan’s FatFs模块为我们提供文件系统,因为我们希望在PC上可以读取日志.

现在我一直在测试FAT系统的边界条件,即试图完全填满卡片.

在第一次运行中,我打开文件并设置代码以继续写入字符串,直到驱动器已满.每次写入后程序都会同步.

我让代码在一夜之间运行.

第二天,我检查了SD卡.我发现该文件的大小只有150 MB.写了大约120万行.该卡仍然可以从中读取但不能写入或格式化.

下次我尝试了相同类型的测试,但这次我使用f_lseek()函数将文件预分配到1GB.然后它将写入该文件,直到达到该限制.这次数据将在50次写入后同步.然后它将关闭该文件并打开另一个文件来执行相同的操作.

正如你可以猜到的那样,另一张勇敢的小卡片当天就失去了它.

所以这些是我想要帮助的:

>如何在写入大量数据时防止卡损坏?
>将文件长时间打开会产生任何负面影响吗?

由于完整的代码可能太长,这里是写作发生的主要部分

for(file_count=3;file_count>=0;--file_count){

    ax_log_msg(E_LOG_INFO,"===================================");

    ax_log_msg(E_LOG_INFO,file_names[file_count]);


    f_open(&file_ptr,file_names[file_count],FA_WRITE|FA_OPEN_ALWAYS);

    if(result!=FR_OK){

        ax_log_msg(E_LOG_INFO,"\n\rf_open Failed\n\rResult code");
        ax_log_msg(E_LOG_INFO,FRESULT_S[result]);

        continue;

    }

    ax_log_msg(E_LOG_INFO,"\n\rf_open Sucessfull");

    result=f_lseek(&file_ptr,FILE_SIZE_LIMIT_1GB);

    if(result!=FR_OK){

        ax_log_msg(E_LOG_INFO,"\n\rf_lseek Failed for preallocation\n\rResult code");
        ax_log_msg(E_LOG_INFO,FRESULT_S[result]);

        f_close(&file_ptr);

        continue;

    }

    ax_log_msg(E_LOG_INFO,"\n\rf_lseek Sucessfull for preallocation");

    f_lseek(&file_ptr,0);

    bytes_to_write=sizeof(messages[file_count]);

    write_count=0;

    while( (f_tell(&file_ptr) < FILE_SIZE_LIMIT_1GB )){

        result=f_write(&file_ptr,messages[file_count],bytes_to_write,&bytes_written);

        if(result==FR_OK){
            ++write_count;

            if(write_count%50==0){

                f_sync(&file_ptr);
            }

        }else{

            ax_log_msg(E_LOG_INFO,"\n\rWrite failed\n\rFRESULT=");
            ax_log_msg(E_LOG_INFO,FRESULT_S[result]);

            break;

        }

    }

    f_close(&file_ptr);


}

注意 :

> ax_log_msg()是要在控制台上打印的设备固件的一部分.
> FRESULT_S [result]用于将枚举结果代码转换为字符串.

如果缺少任何数据,请提及.

谢谢

最佳答案 您可能需要缓冲整个数据块(可能是4 KB),以避免每次刷新时闪烁整个块.但是,文件系统或驱动程序应该为您执行此操作,只要您不明确调用fflush,这才是真正的教训.

你为什么需要这么频繁地同步?也许计时器比每个记录数的间隔更好?

点赞