OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2720|回复: 5

FATFS读取TF卡内容后系统时间被更改了

[复制链接]

20

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2015-1-22
在线时间
57 小时
发表于 2017-12-4 16:55:00 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 leozzd 于 2017-12-5 08:54 编辑

运行的UCOSII,移植了原子哥的FATFS程序,数据能正常一直写入TF卡,只要从TF卡中一读取数据,系统时间的年月日就被更改,求大神们指导下面这段程序……
//////////////////////////////////////////////////////////////////////////////////////////FATFS读写操作////////////////////////////////////////////////////////////////////
FIL TF_File;                 //声明TF卡文件对象
FRESULT res;                //声明TF卡状态返回值
UINT brr, bww;                 //声明TF卡的读写扇区
char ReadBuf  [1024 * 4];

char WFileName[20] = "0:/Log_20160606.txt";                      //TF卡创建的文件名称
char RFileName[17] = "Log_20160606.txt";
unsigned char TF_CardFlag = 0;

//函数名称:void TF_WriteCard(void)
//入口参数:NULL
//返回参数:NULL
//修改说明:NULL
void TF_WriteCard(void)
{
                unsigned int i = 0;
                res=f_open (&TF_File,WFileName, FA_OPEN_ALWAYS | FA_WRITE);        //打开文件并写入数据(指向空白文件对象的指针,指向文件名的指针,访问模式和文件打开模式标志)
                if(res == FR_OK)                                                                                                                                                                                //打开文件成功
                {                                                               
                                f_lseek(&TF_File,TF_File.fsize);                                    //光标定位到文本末尾        
                                f_printf(&TF_File,"[%d-%02d-%02d %02d:%02d:%02d]<接收到%d个数据>:",          //系统当前运行时间,附带写入TF卡
                                                                calendar.w_year,
                                                                calendar.w_month,
                                                                calendar.w_date,
                                                                calendar.hour,
                                                                calendar.min,
                                                                calendar.sec,
                                                                Sig_Cnt);                                                                                                                                             //记录串口收到的时间和个数
                                for(i = 0;i < Sig_Cnt ;i++)
                                {
                                                f_lseek(&TF_File,TF_File.fsize);                              //光标定位到文本末尾
                                                f_printf(&TF_File,"%02X ",USART1_RX_BUF);              //记录串口收到的数据
                                }
                                f_puts("\r\n",&TF_File);                                //显示过行
                                TF_CardFlag = 1;
                                u3_printf("数据已成功写入 \r\n");
                }
                else
                {               
                                TF_CardFlag = 0;
                                u3_printf("数据写入失败!\r\n");
                }
                f_close(&TF_File);                                                                                                                         //关闭文件
}


//函数名称:void TF_ReadCard(unsigned char* DesFile, unsigned char* DesData)
//入口参数:DesFile:目标文件;DesData:目标日志
//返回参数:NULL
//修改说明:NULL
void TF_ReadCard(TCHAR *DesFile)
{
                unsigned int filesize = 0;
                res=f_open (&TF_File,DesFile, FA_OPEN_EXISTING | FA_READ);        //打开文件并读出数据(指向空白文件对象的指针,指向文件名的指针,访问模式和文件打开模式标志)               
                if(res == FR_OK)                                                                                                                                                                                //打开文件成功
                {                                                               
                                filesize = f_size(&TF_File);                                      //计算文件大小
res = f_read (&TF_File, ReadBuf, 1300, &brr);   //读取文件到数组
                                if(res == FR_OK)                                                    //读取文件成功
                                                u3_printf("%s",ReadBuf);                                                                                
                                if(f_eof(&TF_File))                                                       //查询是否到达文件末尾               
                                                u3_printf("\r\n");                                                               
                                u3_printf("已成功读出%d个数据\r\n",filesize);
                }
                else
                                u3_printf("数据读出失败!\r\n");        
                f_close(&TF_File);                         //关闭文件
}
//////////////////////////////////////////////////////////////////////////////////////////FATFS读写操作////////////////////////////////////////////////////////////////////
在读取数据的函数中:res = f_read (&TF_File, ReadBuf, 1300, &brr);           测试过程中发现大于1300这个读取个数,就会影响到后续的系统运行日期,而ReadBuf是有4K的空间大小,还不会超过。调试过程发现,ReadBuf和RTC结构体calendar的内存运行地址也很远,不会出现重叠的情况。时间被篡改后,也无法通过指令修改时间,强行写入也不行。

改时间

改时间

运行情况图片如下,写入数据时,时间运行正常,也能完整记录进TF卡,一旦从TF卡中读取数据出来,系统运行时间的年月日就开始变化,写入TF卡的时间也跟着改变了

运行情况

运行情况

写入TF卡情况:

记录数据

记录数据




最佳答案

查看完整内容[请看2#楼]

自己回来结帖吧,字符串打印u3_printf("%s",ReadBuf); 换成字符逐个打印u3_printf("%c",ReadBuf【i】就可以了~~~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2015-1-22
在线时间
57 小时
 楼主| 发表于 2017-12-4 16:55:01 | 显示全部楼层
自己回来结帖吧,字符串打印u3_printf("%s",ReadBuf);  换成字符逐个打印u3_printf("%c",ReadBuf【i】就可以了~~~
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-5 01:35:33 | 显示全部楼层
仿真找问题
回复

使用道具 举报

20

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2015-1-22
在线时间
57 小时
 楼主| 发表于 2017-12-5 08:56:20 | 显示全部楼层

仿真发现,只有在读取数据时,系统RTC日期就被更改,也跟踪不到源头来自哪里,运行的是UCOSII,RTC一个任务,读写卡一个任务,求原子哥指导……
回复

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2017-12-5 17:18:59 | 显示全部楼层
查看 时间 变量那个内存地址,然后在读1300数据时候 设置断点,查看在哪里改了
1-1
回复

使用道具 举报

20

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2015-1-22
在线时间
57 小时
 楼主| 发表于 2017-12-5 20:11:27 | 显示全部楼层
mygod 发表于 2017-12-5 17:18
查看 时间 变量那个内存地址,然后在读1300数据时候 设置断点,查看在哪里改了

在RTC_Set函数里面设置了断点,在读取TF卡处设置了断点,RTC里的断点没有跳转,日期却无故给改了。最后发现是打印函数出的问题,读取整个数组的字符串u3_printf("%s",ReadBuf);  换成逐个字符打印u3_printf("%c",ReadBuf【i】);就正常了,不知道这究竟哪里出问题~~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 18:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表