STM32H743驱动eMMC挂载FatFs日志记录功能

前面的文章实现了 STM32H743 驱动 eMMC 挂载 FatFs 文件系统,接下来介绍一个实用功能——日志记录,日志记录是嵌入式系统中常用的功能,主要是将运行中的数据转换为字符串,然后再写入到 eMMC。

实现日志记录需要解决 2 个问题:

  1. 程序中各种格式的数据变量转换为字符串;
  2. eMMC 文件关闭后再次打开继续接着写。

一、数据变量转换为字符串

解决该问题是使用函数 sprintf(),函数具体定义和用法请看 C 标准库。

“%02d”是输出 2 位宽度的十进制,“%.1f”是输出浮点数小数点保留 1 位,其他类推。

//每天中午 12 点记录一次传感器数据
void Write_Log(void)
{
	if((Bm_Date.hour == 12)&&(Bm_Date.minute == 0))
	{
		sprintf(str_zt,"20%02d%02d%02d %02d:%02d:%02d T:%.1f RH:%.1f%%\nPM2.5:%.1fug/m3 PM10:%.3fmg/m3 TVOC:%.4fmg/m3 HCHO:%.3fmg/m3 NH3:%.3fmg/m3 H2S:%.1fppm\n",Bm_Date.year,Bm_Date.month,Bm_Date.day,Bm_Date.hour,Bm_Date.minute,Bm_Date.second,Temperature,Humidity,PM2D5,PM10,TVOC,CH2O,NH3,H2S);
		printf("%s",str_zt);
		Write_TFCard();		
	}
}	

sprintf()函数是将字符串和各种变量按照格式输出到一个字符串 str_zt 里,输出完毕后效果就是将分散的信息连接到了一起。另外该函数返回值是连接的总字节数,使用起来非常方便。然后再打印 printf(“%s”,str_zt),效果如下。

20210117 22:23:00 T:0.0 RH:0.0% PM2.5:0.0ug/m3 PM10:0.000mg/m3 TVOC:0.0000mg/m3 HCHO:0.000mg/m3 NH3:0.000mg/m3 H2S:0.0ppm

二、eMMC 文件关闭后再次打开继续接着写

解决该问题是使用 f_lseek(&fil,n)函数。该函数是将文件指针从文件头向下偏移 n 个字节。

另外必须注意 f_open 文件打开方式,要使用 FA_OPEN_ALWAYS | FA_WRITE。如果是用了 FA_CREATE_ALWAYS | FA_WRITE,会覆盖上次写的文件重新建个文件。

void Write_TFCard(void)
{
		printf("\r\n ****** 文件系统 ******\r\n\r\n");
 
    /*-1- 挂载文件系统*/
	retSD = f_mount(&fs, "", 0);
    if(retSD)
    {
        printf(" mount error : %d \r\n",retSD);
        Error_Handler();
    }
    else
        printf(" mount sucess!!! \r\n");
     
    /*-2-创建新的文件并写入数据*/
    retSD = f_open(&fil, filename, FA_OPEN_ALWAYS | FA_WRITE);		//打开文件,权限包括创建、写(如果没有该文件,会创建该文件)
    if(retSD)															//返回值不为 0(出现问题)
        printf(" open file error : %d\r\n",retSD);						//打印问题代码
    else
        printf(" open file sucess!!! \r\n");
	
      /*-3- 偏移指针到末尾处*/	   
	printf(" file size: %d \r\n",(int)fil.fsize);
	f_lseek(&fil,fil.fsize);
	
    /*-4- 在 txt 文件尾续写数据*/	
	
	retSD = f_write(&fil, str_zt, sizeof(str_zt), (void *)&byteswritten);	//在文件内写入 wtext 内的内容	

	if(retSD)															//返回值不为 0(出现问题)
        printf(" write file error : %d\r\n",retSD);						//打印问题代码
    else
    {
        printf(" write file sucess!!! \r\n");
        printf(" write Data : %s\r\n",str_zt);							//打印写入的内容
    }
     
    /*-5- 关闭 txt 文件*/
    retSD = f_close(&fil);												//关闭该文件
    if(retSD)															//返回值不为 0(出现问题)
        printf(" close error : %d\r\n",retSD);							//打印问题代码
    else
        printf(" close sucess!!! \r\n");
}

以上程序合在一起运行打印效果如下:

STM32H743驱动eMMC挂载FatFs日志记录功能

可以看出,每次打开文件获取的文件大小是累加的,然后按照这个累加值偏移文件指针到续写位置即可。这两个简单函数即实现了将多种变量信息保存记录到 eMMC 里,至于什么时间记录,多久记录一次,就自己定了。最后通过 USB 连接至 PC,用记事本打开:

STM32H743驱动eMMC挂载FatFs日志记录功能

这样就可以很方便的实现日志记录功能。

扫码关注尚为网微信公众号

尚为网微信公众号
每天学习电路设计嵌入式系统的专业知识,关注一波,没准就用上了。

原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/941.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2021年4月2日 21:31
下一篇 2021年4月7日 13:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注