完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32挂载SD卡记录日志
程序主要是在前一篇的基础上进行。使用CUBE配置STM32挂载TF卡, 记录日志主要是将运行中的数据转换为字符串,然后再写入到SD卡。需要解决两个问题:
//每天中午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:%.1fppmn",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("rn ****** 文件系统 ******rnrn"); /*-1- 挂载文件系统*/ retSD = f_mount(&fs, "", 0); if(retSD) { printf(" mount error : %d rn",retSD); Error_Handler(); } else printf(" mount sucess!!! rn"); /*-2-创建新的文件并写入数据*/ retSD = f_open(&fil, filename, FA_OPEN_ALWAYS | FA_WRITE); //打开文件,权限包括创建、写(如果没有该文件,会创建该文件) if(retSD) //返回值不为0(出现问题) printf(" open file error : %drn",retSD); //打印问题代码 else printf(" open file sucess!!! rn"); /*-3- 偏移指针到末尾处*/ printf(" file size: %d rn",(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 : %drn",retSD); //打印问题代码 else { printf(" write file sucess!!! rn"); printf(" write Data : %srn",str_zt); //打印写入的内容 } /*-5- 关闭txt文件*/ retSD = f_close(&fil); //关闭该文件 if(retSD) //返回值不为0(出现问题) printf(" close error : %drn",retSD); //打印问题代码 else printf(" close sucess!!! rn"); } 以上程序合在一起运行打印效果如下: 可以看出,每次打开文件获取的文件大小是累加的,然后按照这个累加值偏移文件指针到续写位置即可。 这两个简单函数即实现了将多种变量信息保存记录到SD卡里,至于什么时间记录,多久记录一次,就自己定了。 最后将SD卡放电脑上,记事本打开看看: 为什么要进行格式转换输出,记录是给人看的,不是给机器,所以必须用人熟悉的格式。当然也可以用HEX格式记录数据,不过对人的可读性就差多了。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
728浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
568浏览 3评论
593浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 14:54 , Processed in 0.809883 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号