june2008 发表于 2011-7-5 21:11:00

怎么在SD实现txt的读写?

现在单片机可以在没有文件系统下自由实现扇区的读写了,现在想实现下面的功能:SD卡在电脑里建立几个txt文档,起好名字,然后SD插在单片机里找到某个文件可以对其写操作,然后可以在电脑里看到写入的内容。其他的什么别的类型文档,单片机里文件的建立删除等什么都不要,难做吗?以前没做过,一点都不知啊,有做过的吗给指导一下。

NJ8888 发表于 2011-7-5 21:16:28

你不用文件系统如何找文件?

june2008 发表于 2011-7-5 21:22:40

可不可以这样,就是写几个函数,按照电脑下文件系统的存储格式,用程序找到相关的文件名以及存储的簇的起始地址什么的,直接往里写数据?不用一直一个文件系统了,移植文件系统的话麻烦吗?

dengting 发表于 2011-7-5 22:19:46

可以!
理论上

june2008 发表于 2011-7-6 18:02:59

网上看到一个程序,就是模仿txt文件的格式写的两个函数,主要实现的写,不能建立文件和修改删除文件,但是没看明白main函数里的这个调用:TXT_WRITE(txt_name,0x38);不知道参数里的txt_name是什么东西,只看到他在全局变量定义了这么一个数组:下边的这个数组,我想txt_name是不是我需要在电脑里建立的一个txt文件的名字?那根据这个txt_name,我电脑里起什么名字呢?

往txt里写代码的代码片段:
uchar se={0},txt_name={0x34,0x35,0x36,0x00,0x00,0x00,0x00,0x00};
uintfile_table={0};

uint SEARCH_TXT(uchar* pcmd)//根目录区找到文件,找到文件起簇,文件名小于等于8字节
{
        uint i=0,j=0,k=0;
        ulong fat=0;//文件分配表
        ulong fdt=0;//文件目录表
        //ulong dat=0;//数据区
        uint BPB_bSecPerClus=0; //ofs:13.每簇扇区数。
    uint BPB_wReservedSec=0; //ofs:14.保留扇区数,从DBR 到FAT 的扇区数。
    uint BPB_bNumFATs=0; //ofs:16.FAT 的个数。
        uint BPB_wSecPerFAT=0; //ofs:22.每个FAT 占的扇区数。
    uint StartClus=0; //ofs:26.开始簇号
        SD_ReadSingleBlock(0);//读取主引导记录区(MBR)
        BPB_bSecPerClus=se; //ofs:13.每簇扇区数。
        BPB_wReservedSec=se*256+se; //ofs:14.保留扇区数,从DBR 到FAT 的扇区数。
        BPB_bNumFATs=se;//ofs:16.FAT 的个数。
        BPB_wSecPerFAT=se*256+se;//ofs:22.每个FAT 占的扇区数。

        fat=BPB_wReservedSec;//文件分配表

        fdt=BPB_bNumFATs*BPB_wSecPerFAT+fat;//文件目录表

    file_table=fat;
        file_table=fdt;    //将表扇区通过全局数组存储起来


    for(k=0;k<32;k++)
        {
                SD_ReadSingleBlock(fdt+k);//读取文件目录表
                for(i=0;i<512;)
                {
                        for(j=0;j<8;j++)
                        {
                                if(*(pcmd+j)==0x00)
                                *(pcmd+j)+=0x20;      //SD卡中空余为0X20
                                if(se!=*(pcmd+j))//不相等则跳出此8此循环
                                break;
                                if(j==7)
                                {
                                        StartClus=se*256+se; //ofs:26.开始簇号
                                       
                                        se++;                //每次写入1个字节   
                                        if(se==0x00)
                                        {
                                                se++;
                                                if(se==0)
                                                {
                                                        se++;
                                                        if(se==0)
                                                        {
                                                                se++; //将该文件的长度修改
                                                        }
                                                }
                                        }
                                        SD_WriteSingleBlock(fdt+k,se); //写入修改后的文件长度

                                        return StartClus;//找到该文件并返回该文件起始簇号
                                }
       
                        }
                        i+=0x20;//下一个目录,下移32字节
                }
        }
        return 0xffff;       
}

void TXT_WRITE(uchar* pcmd,uchar write_data)
{
        uchar i=0,flag=0;
    uint j=0;
        uint StartClus=0; //ofs:26.开始簇号
        StartClus=SEARCH_TXT(pcmd);//得到该文件开始簇号,若为0xff则未找到该文件
   //SD_READ_BOLOCK(file_table); //读取文件分配表,查看文件所占簇
    file_table=StartClus*16+file_table;//数据区=簇号*16+文件目录表
        for(i=0;i<16;i++)
        {
                SD_ReadSingleBlock(file_table+i);//遍历数据区
                for(j=0;j<512;j++)
                {
                        if(se==0x00)
                        {
                                se=write_data;
                                flag=1;
                                SD_WriteSingleBlock(file_table+i,se);//写入必须以整扇区为基本单位
                                break;       
                        }
                }
        //        SD_READ_BOLOCK(file_table+iq);//遍历数据区
                if(flag==1)
                break;
        }

}
//************************主函数**************************   
int main(void)
{
   unsigned char loop,res;

   delay();
   delay();
   delay();
   loop=1;
   
   cs=1;
   while(loop)
   {
      spi_init();                  //调用系统初始化函数
      res= sd_reset();               //调用SD卡初始化函数
            if(res) break;             //SD卡初始化是否正常,不正常,退出循环,不执行下面的读写操作
      TXT_WRITE(txt_name,0x38);
                asm ("nop");
                asm ("nop");

      loop=0;
         while(1);
   }
   while(1);
}

june2008 发表于 2011-7-6 21:57:50

没人做过相关方面的东西吗?

june2008 发表于 2011-7-7 21:35:46

再顶起来看看,找个明白人

turf456 发表于 2011-7-7 22:46:26

先学会fat32文件系统的结构。以及如何用c描述出来。看别人的不如自己写。
难度不亚于你之前做过的所有。

yiminglei 发表于 2011-7-7 23:27:48

不懂FAT,你找不到TXT的相关属性和数据。。。

学习FAT吧,不算难的,百度就有很多中文文档,实现的代码ouravr就有很多。

我简单说说在FAT32找TXT的实现步骤(假设SD卡格式化后,只有一个文件):
1.如果SD卡第一个扇区是MBR扇区,通过MBR找到DBR扇区地址。

2.如果SD卡没有MBR扇区,那么第一扇区就是DBR扇区。

3.通过DBR扇区找到数据区地址。

4.搜索数据区找到TXT的属性项,通过属性项获得TXT文件数据的簇地址及TXT文件大小。

5.把TXT的簇地址根据DBR扇区相关信息,转换成TXT的扇区地址。

6.通过TXT的扇区地址,找到TXT的内容扇区,有效内容需通过TXT文件大小确定。

hdd961140543 发表于 2011-7-8 00:46:03

楼主是要做快速数据存储吗,所以怕文件系统太费时了?

我觉得这样的话好像就不能随便向SD卡中再写信的文件了,就只有一个TXT文件,这样就比较简单。

june2008 发表于 2011-7-8 08:49:06

回复【8楼】yiminglei BI7KMT
-------------------------------------------------------------------
我是准备直接在电脑里给SD建立两个txt,然后以后就只读或是删除这两个txt,有问题吗?

yuanwei703 发表于 2011-7-8 10:34:42

回复【9楼】hdd961140543 阿逸
-----------------------------------------------------------------------

实在不行了,就只有这样了,只要一个文件,只可以往里写数据,不能新建。

hdd961140543 发表于 2011-7-8 16:56:54

回复【11楼】yuanwei703
-----------------------------------------------------------------------
如果要新建的话,就必须得文件系统才行。
我也打算用SD卡来做存储器,而且要求速度很快才行,需要在电脑上可以方便查看,就想到了楼主你的方式。
不过还没有实际开始试验,但可行性挺高的。

she506 发表于 2011-7-11 16:11:26

回复【楼主位】june2008
-----------------------------------------------------------------------

楼主啊,我也想学习一下这方面,有什么经验或资料共享一下啊,呵呵

ricefat 发表于 2011-7-20 11:00:12

标记

polun2011 发表于 2011-11-25 15:44:14

mark

daishixin 发表于 2014-8-14 19:16:23

你的思路我觉得可行,但是我没有试验过:
1,先建立一个内容较大的文本文件(内容全是0h)
2,利用WinHex找处此文件的数据储存地址,
3,mcu对此sd卡直接进行读写
4,注意写的内容不要大于原文本文件即可
原理我觉得和一些木马或者病毒程序生成下载者程序差不多.{:biggrin:} 以后有空再做试验测试一下.
页: [1]
查看完整版本: 怎么在SD实现txt的读写?