智能车制作

标题: 用SD卡存储摄像头采集的数据,结果老是错误,求解高手 [打印本页]

作者: 斯馨妍子    时间: 2013-3-26 16:31
标题: 用SD卡存储摄像头采集的数据,结果老是错误,求解高手
我用龙丘的K60调SD卡,采用FAT32文件系统,只是大致看了一下文件系统的函数,然后编写了SD卡存储程序,可能程序思路上有问题。(问题是SD卡中有数据存储,但是是乱码,乱码是一些符号的ASCLL码,不知道是不是堆栈乱了)希望前辈指教。
程序说明,因为文件系统设置了一个扇区只能存512KB,我采集的一场图像大小为170X90=15300KB,故我利用函数将这一图像分15300/512=29块存储,每一场都是如此。
首先,在系统初始化后,对SD也进行了初始化(ROW*COLUMN是图像的行与列数,已经宏定义了
res = f_mount(0,&fs);      // for logical drive 0   
   for(i=0;i<ROW*COLUMN;i++)   //要写入的数据,用户可以把数据放到该数组,然后写入SD卡即可。
     {                        
              filebuff = '2';                 //更新缓冲区的数据内容          随便给一个值         
     }
                
                filebuff[ROW*COLUMN-3] = ' ';  //空格
                filebuff[ROW*COLUMN-2] = 0x0d; //回车               ASCII 代码13即   \r(回车,即将当前位置移到本行开头)
                 filebuff[ROW*COLUMN-1] = 0x0a; //最后一个字符为换行         ASCII 代码10即   \n(换行)
                 res = f_open(&faddata,"ccd_data.txt",FA_CREATE_ALWAYS | FA_WRITE);  //打开SD卡文件,如果没有找到,则创建一个文件       
然后,进入主循环后,等待中断,因为我是隔场采得,所以数据也是隔场存储

每一场存储程序如下
res = f_mount(0,&fs);      // for logical drive 0
       
                for(n=0; n<ROW; n++)                    //更新缓存区,将im_data[][]存储到filebuff[]
                {
                        for (m=0; m<COLUMN; m++)
                        {
                            filebuff[j]=im_data[n][m];
                            j++;
                          }         
                }

filebuff[ROW*COLUMN-3] = ' ';  //空格
filebuff[ROW*COLUMN-2] = 0x0d; //回车                                                
filebuff[ROW*COLUMN-1] = 0x0a; //最后一个字符为换行           
   j=0;                    //i计数清零
                  
res = f_open(&faddata,"ccd_data.txt",FA_OPEN_ALWAYS | FA_WRITE);//打开SD卡文件,如果没有找到,则创建一个文件       
       
         /*************************保存数据到SD卡**********************************************/
                    if(!res)  // 打开文件成功
                    {
                        //写入数据
                        for(i=0;i<(ROW*COLUMN)/512+1;i++)
                        {   
                      //这两句是不是指针有问题      ?         
                             res = f_lseek(&faddata,f_size(&faddata));             //写指针移到文件末尾   
                            res = f_write(&faddata,&filebuff[i*512-1],filebuffoffset, &bw); //将文件缓冲区里的数据写入l       
                       }
                       LCD_P8x16Str(0,4,(unsigned char*)"writing OK!     ");          //英文字符串显示     
                        res = f_close(&faddata);                                           //关闭lccd_data.txt  
                       LCD_P8x16Str(0,4,(unsigned char*)"  file colesed  ");          //英文字符串显示
                       light_change(Light_Run_PORT,Light_Run2);//指示灯的亮、暗状态切换
                    }


这样,结果SD卡中有数据存储,但是是乱码,是一些符号的ASCLL码,郁闷了,调了好些天憋这了,估计不是什么大问题,求高人点拨,指出我程序中的问题。谢谢,感激不尽

作者: 灰原姐姐    时间: 2013-3-26 18:36
你分成29份,那就要写29次,你知道写一次要用多少时间吗?
作者: exiao    时间: 2013-3-26 18:44
学习下,这个有难度
作者: 斯馨妍子    时间: 2013-3-26 19:28
灰原姐姐 发表于 2013-3-26 18:36
你分成29份,那就要写29次,你知道写一次要用多少时间吗?

读写速度25M/s,这样算来,写一块写一场需要0.6ms左右,影响不大吧

作者: 灰原姐姐    时间: 2013-3-26 21:02
斯馨妍子 发表于 2013-3-26 19:28
读写速度25M/s,这样算来,写一块写一场需要0.6ms左右,影响不大吧

如果你每场都要写,那就只能用场消隐区的时间来写。
那就只有两三毫秒,那就不够了。

作者: 斯馨妍子    时间: 2013-3-26 22:10
灰原姐姐 发表于 2013-3-26 21:02
如果你每场都要写,那就只能用场消隐区的时间来写。
那就只有两三毫秒,那就不够了。

不是的,我已经说明我采取隔场采,每场周期20ms,隔一场就是有20ms间隔,存储和其他操作时间完全足够,请问你调过吗,有何高见
作者: 灰原姐姐    时间: 2013-3-27 11:34
斯馨妍子 发表于 2013-3-26 22:10
不是的,我已经说明我采取隔场采,每场周期20ms,隔一场就是有20ms间隔,存储和其他操作时间完全足够,请 ...

存的应该就是你要存的数据。
你存的是什么类型的,你要相应地按照什么类型的格式读取。
你如果全部按照字符来读取,自然是乱码。

作者: 斯馨妍子    时间: 2013-3-27 18:56
灰原姐姐 发表于 2013-3-27 11:34
存的应该就是你要存的数据。
你存的是什么类型的,你要相应地按照什么类型的格式读取。
你如果全部按照 ...

是这样的,这方面没问题,我存的是txt  读时也是txt,之前存一场图像即15300kb时数据都是正确的,我估计是指针出错了,你可以帮看一下我用颜色注释的那两句程序有什么问题吗

作者: 等候、乜美    时间: 2014-2-24 12:33
   filebuff []怎么定义的?




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2