STM32挂载SD卡记录日志
程序主要是在前一篇的基础上进行。使用CUBE配置STM32挂载TF卡,请看https://ydgd118.blog.csdn.net/article/details/111253588。
记录日志主要是将运行中的数据转换为字符串,然后再写入到SD卡。需要解决两个问题:

  1. 程序中各种格式的数据变量转换为字符串;
  2. SD卡文件关闭后再次打开继续接着写。
    解决第一个问题是使用函数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

解决第二个问题是使用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();}elseprintf(" 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);                        //打印问题代码elseprintf(" 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);                            //打印问题代码elseprintf(" close sucess!!! \r\n");
}

以上程序合在一起运行打印效果如下:
可以看出,每次打开文件获取的文件大小是累加的,然后按照这个累加值偏移文件指针到续写位置即可。
这两个简单函数即实现了将多种变量信息保存记录到SD卡里,至于什么时间记录,多久记录一次,就自己定了。
最后将SD卡放电脑上,记事本打开看看:
为什么要进行格式转换输出,记录是给人看的,不是给机器,所以必须用人熟悉的格式。当然也可以用HEX格式记录数据,不过对人的可读性就差多了。

STM32挂载SD卡记录日志相关推荐

  1. STM32挂载SD卡基于Fatfs文件系统读取文件信息

    STM32挂载SD卡基于Fatfs文件系统读取文件信息

  2. stm32 读取sd卡图片显示_「正点原子STM32Mini板资料连载」第三十五章 汉字显示实验...

    1)实验平台:正点原子STM32mini开发板 2)摘自<正点原子STM32 不完全手册(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第三十五章 汉字显示实验 汉字显示在 ...

  3. Hi3516A开发--挂载SD卡和U盘

    一.SD卡 1.通过fdisk -l命令确认板子上的linux系统是否识别SD卡 / # fdisk -l Disk /dev/mmcblk0: 63.8 GB, 63864569856 bytes ...

  4. 海思系统开发——linux下挂载SD卡

    海思系统开发--linux下挂载SD卡 (1)通过#fdisk -l命令确认板子上的linux系统是否识别SD卡 [/]# fdisk -l /mnt/mmc # fdisk -l Disk /dev ...

  5. RTThread 挂载SD卡 init SD card failed

    项目场景 RTThread系统挂载SD卡 STM32F407 替换为 GD32F407 问题描述 在使用STM32F407主芯片时挂载SD卡正常运行,同样的程序同样的板卡,主芯片换成了GD32F407 ...

  6. stm32驱动sd卡(1)

    Stm32驱动sd卡知识总结(1) 1.Stm32支持SDIO接口,可以用来接入一张不超过32G的SD卡 2.CID寄存器长度为128bit,用来标记SD卡的全球唯一身份识别号 3.支持单线和四线传输 ...

  7. STM32之SD卡【写的太好了 转载 】

    https://www.cnblogs.com/amanlikethis/p/3757876.html#lab11 目录 一.SD卡概述 1.定义 2.容量等级 3.SD卡框图 4.SD卡与TF卡的区 ...

  8. Exynos4412 移植针对Samsung的Linux-6.1(二)SD卡驱动——解决无法挂载SD卡的根文件系统

    系列文章目录 Exynos4412 移植针对Samsung的Linux-6.1(一)下载.配置.编译Linux-6.1 Exynos4412 移植针对Samsung的Linux-6.1(二)SD卡驱动 ...

  9. 无法挂载sd卡(android),不能安装APK(1)

    1.应用程序下载的话是默认安装到/mnt/sdcard下的,如果你sd卡没挂载上,系统会提示你request an SD卡或者damage SD卡,所以此时你去这个/mnt/sdcard或者/sdca ...

最新文章

  1. python3.7.2教程-centos7系统下python2与python3共存
  2. stm32 usb 虚拟串口 相同_RTThread STM32 虚拟串口代码级移植
  3. postman 变量
  4. 使用gitkraken来push的流程
  5. Mybaits插入记录返回主键值
  6. mysql保存plc数据_MySQL空间数据的保存
  7. mysql删除盘点表,用友U8数据库表名参照表修改号参考.doc
  8. 二进制 十进制 十六进制
  9. java多线程之守护线程以及Join方法
  10. 物体检测学习笔记-3D相机成像原理简介
  11. ONNX: export failure: Exporting the operator silu to ONNX opset version 12 is not suppo
  12. 批量删除html网页,ie浏览器收藏夹网页批量删除方法
  13. xeon e5-2400 系列处理器能做四路服务器吗?,英特尔Xeon E5系列双路处理器大阅兵
  14. 线性代数二次型标准化的方法总结
  15. 【Pytorch】torch.backends.cudnn.benchmark 作用
  16. 迸发中的小i机器人,2018年多处开花
  17. 传输层概述以及传输层端口
  18. BZOJ——T 1707: [Usaco2007 Nov]tanning分配防晒霜
  19. 一种值得借鉴的设计思路
  20. 学生对计算机课程的意见建议,学生对学校工作的意见和建议

热门文章

  1. selenium操作日历控件
  2. 英文标点符号使用和意义
  3. 入门飞控——1.四轴飞行器的基本组成
  4. 基于STM32的OLED播放Bad apple
  5. Win10如何设置定时开关机休眠唤醒
  6. An Integrated Neighborhood Dependent Approach for Nonlinear Enhancement of Color Images
  7. 火狐浏览器韩国文字成方块显示 debian11
  8. PHP设计模式之迭代器模式
  9. “剥皮”法求区域中心 (转)
  10. 揭秘一下你不知道的海外广告投放渠道