嵌入式fat32简单应用

使用stm32精英版开发板,外置sd卡,

使用fat32记录固定容量数据的方法,当出现新故障,自动替换掉最旧记录的简易方法

思路,在写入记录一行一行往下记录,当超过要最多的记录时,文件指针返回到首地址开始记录。这样的话就会出现如果断电,程序重新开始,无法知哪条记录为最新,所以,在写入记录前,加入标志符,为最新的记录,前面标志符为1,其余都为0,程序便知道文件的最新记录为哪一条

typedef struct
{
	int old_adr;//一条内容的起点,
	int adr;//一条内容的终点
	int sum_row;//当前有多少行,防止轮回写记录的时候,导致后面记录消失
	int max_adr;//此文件最大数据
}Txt_Info;
Txt_Info m_Txt_Info;

 下列代码实现,用来保存已经查找的一条记录的开始和末尾的指针

void updateAdr(int data)
{
	if(!m_Txt_Info.adr)
	{
		 m_Txt_Info.adr = data;
	}
	else
	{
		m_Txt_Info.old_adr = m_Txt_Info.adr+1;
		m_Txt_Info.adr = m_Txt_Info.old_adr + data;
	}
	m_Txt_Info.sum_row++;
	
	
}

下面用来从开头插找对每行数据,并记录查照的记录的首尾,当查询到标志为1时停止, 

int get_file_row(FIL *fp)//获得最旧纪录,1为找见已经记录的最新故障,
{
	unsigned char buffer[30];//一行最多的数据
	
	UINT br;
	int i,j = 0;

	int_data();
	//---------------------------------------------
	if(!(fp->fsize))//新文件停留则为第一行
	{
		updateAdr(0);//保存当前文件的头和尾地址
		return 1;
	}
	f_lseek(fp,0);//移动到文件开头
	br = 1;//启动循环
	for(j = 0;br;j++)
	{
		f_read(fp,buffer,sizeof(buffer),&br);
		for(i =1;i <br;i++)
		{
			if(('\r' == buffer[i -1])&&('\n' == buffer[i]))
			{
				updateAdr(i);//保存当前文件的头和尾地址
				break;
			}	
		}
		if('1' == buffer[0])//寻找到标记
		{
			
			return 1;
		}
		f_lseek(fp,m_Txt_Info.adr+1);
	}	
	return 0;
	
}

 写入数据函数,在查找到最新记录后,先将上一行的数据1处改成0,然后在新行写入数据,将fp->指针移动到pf移动到文件指针出现的最大处,关闭文件,否则出现写入新数据后出现后面数据丢失的情况。

void write_date(FIL *fp)

{

    //f_lseek(fp,fp.fsize-1);

    UINT br;    

    if(get_file_row(fp))

    {

       

        f_lseek(fp,m_Txt_Info.old_adr);

        //if(m_Txt_Info.adr)//如果为首行,则不写

        {

            f_write(fp,"0",1,&br);

        }

        if(m_Txt_Info.sum_row > max_raw)//超过最大行数,

        {

            int_data();//初始化文件指针

        }

        if(!(m_Txt_Info.adr))

        {

            f_lseek(fp,m_Txt_Info.adr);

        }

        else

        {

            f_lseek(fp,m_Txt_Info.adr+1);

        }

        f_write(fp,context,sizeof(context)-1,&br);

        if(fp->fsize > m_Txt_Info.max_adr)

        {
            m_Txt_Info.max_adr = fp->fsize;
        }

        f_lseek(fp,m_Txt_Info.max_adr);

    }

    else

    {

        err = 2;

    }

}

软件源码 fat32记录信息处理-C++文档类资源-CSDN下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32微控制器的应用领域广泛,从简单的传感器应用到复杂的工业控制和汽车电子等应用。其中,嵌入式文件系统是一个重要的应用之一,而FAT(文件分配表)文件系统是嵌入式文件系统的一种通用类型。本文将介绍STM32微控制器的Fat文件系统使用示例。 首先,我们需要选择适合我们MCU的FAT文件系统库。本文介绍的是FatFS库(http://elm-chan.org/fsw/ff/00index_e.html)。 一般而言,文件系统的使用需要以下步骤: 1. 初始化文件系统:初始化文件系统时需要分配磁盘容量,定义文件路径等。在FatFS库中,我们可以使用f_mount函数来设置这些参数。 2. 创建文件:使用f_open函数来打开一个新文件。在文件系统中创建一个文件是一个比较耗时的操作。 3. 读取/写入文件:可以使用f_read和f_write函数来读取或写入文件的数据。在文件读写时可以使用缓冲区来加速数据的读写。 4. 关闭文件:使用f_close函数来关闭文件并保存所有更改。 值得注意的是,文件系统使用的主要函数都需要配置硬件接口,并处理中断。在STM32的FatFS库中,我们可以使用SPI或SDIO接口来连接外部SD卡或USB存储器,并使用DMA处理器和相关FSMC或GPIO中断来传输数据。 综上所述,FatFS库是STM32微控制器中使用文件系统的一种广泛应用。使用FatFS库时需要了解文件系统的基本使用方法和库函数,同时需要正确地配置STM32硬件接口和处理中断等复杂的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值