STM32挂载SD卡记录日志
STM32挂载SD卡记录日志
程序主要是在前一篇的基础上进行。使用CUBE配置STM32挂载TF卡,请看https://ydgd118.blog.csdn.net/article/details/111253588。
记录日志主要是将运行中的数据转换为字符串,然后再写入到SD卡。需要解决两个问题:
- 程序中各种格式的数据变量转换为字符串;
- 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卡记录日志相关推荐
- STM32挂载SD卡基于Fatfs文件系统读取文件信息
STM32挂载SD卡基于Fatfs文件系统读取文件信息
- stm32 读取sd卡图片显示_「正点原子STM32Mini板资料连载」第三十五章 汉字显示实验...
1)实验平台:正点原子STM32mini开发板 2)摘自<正点原子STM32 不完全手册(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第三十五章 汉字显示实验 汉字显示在 ...
- Hi3516A开发--挂载SD卡和U盘
一.SD卡 1.通过fdisk -l命令确认板子上的linux系统是否识别SD卡 / # fdisk -l Disk /dev/mmcblk0: 63.8 GB, 63864569856 bytes ...
- 海思系统开发——linux下挂载SD卡
海思系统开发--linux下挂载SD卡 (1)通过#fdisk -l命令确认板子上的linux系统是否识别SD卡 [/]# fdisk -l /mnt/mmc # fdisk -l Disk /dev ...
- RTThread 挂载SD卡 init SD card failed
项目场景 RTThread系统挂载SD卡 STM32F407 替换为 GD32F407 问题描述 在使用STM32F407主芯片时挂载SD卡正常运行,同样的程序同样的板卡,主芯片换成了GD32F407 ...
- stm32驱动sd卡(1)
Stm32驱动sd卡知识总结(1) 1.Stm32支持SDIO接口,可以用来接入一张不超过32G的SD卡 2.CID寄存器长度为128bit,用来标记SD卡的全球唯一身份识别号 3.支持单线和四线传输 ...
- STM32之SD卡【写的太好了 转载 】
https://www.cnblogs.com/amanlikethis/p/3757876.html#lab11 目录 一.SD卡概述 1.定义 2.容量等级 3.SD卡框图 4.SD卡与TF卡的区 ...
- Exynos4412 移植针对Samsung的Linux-6.1(二)SD卡驱动——解决无法挂载SD卡的根文件系统
系列文章目录 Exynos4412 移植针对Samsung的Linux-6.1(一)下载.配置.编译Linux-6.1 Exynos4412 移植针对Samsung的Linux-6.1(二)SD卡驱动 ...
- 无法挂载sd卡(android),不能安装APK(1)
1.应用程序下载的话是默认安装到/mnt/sdcard下的,如果你sd卡没挂载上,系统会提示你request an SD卡或者damage SD卡,所以此时你去这个/mnt/sdcard或者/sdca ...
最新文章
- python3.7.2教程-centos7系统下python2与python3共存
- stm32 usb 虚拟串口 相同_RTThread STM32 虚拟串口代码级移植
- postman 变量
- 使用gitkraken来push的流程
- Mybaits插入记录返回主键值
- mysql保存plc数据_MySQL空间数据的保存
- mysql删除盘点表,用友U8数据库表名参照表修改号参考.doc
- 二进制 十进制 十六进制
- java多线程之守护线程以及Join方法
- 物体检测学习笔记-3D相机成像原理简介
- ONNX: export failure: Exporting the operator silu to ONNX opset version 12 is not suppo
- 批量删除html网页,ie浏览器收藏夹网页批量删除方法
- xeon e5-2400 系列处理器能做四路服务器吗?,英特尔Xeon E5系列双路处理器大阅兵
- 线性代数二次型标准化的方法总结
- 【Pytorch】torch.backends.cudnn.benchmark 作用
- 迸发中的小i机器人,2018年多处开花
- 传输层概述以及传输层端口
- BZOJ——T 1707: [Usaco2007 Nov]tanning分配防晒霜
- 一种值得借鉴的设计思路
- 学生对计算机课程的意见建议,学生对学校工作的意见和建议