怎么在SD实现txt的读写?
现在单片机可以在没有文件系统下自由实现扇区的读写了,现在想实现下面的功能:SD卡在电脑里建立几个txt文档,起好名字,然后SD插在单片机里找到某个文件可以对其写操作,然后可以在电脑里看到写入的内容。其他的什么别的类型文档,单片机里文件的建立删除等什么都不要,难做吗?以前没做过,一点都不知啊,有做过的吗给指导一下。 你不用文件系统如何找文件? 可不可以这样,就是写几个函数,按照电脑下文件系统的存储格式,用程序找到相关的文件名以及存储的簇的起始地址什么的,直接往里写数据?不用一直一个文件系统了,移植文件系统的话麻烦吗? 可以!理论上 网上看到一个程序,就是模仿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);
} 没人做过相关方面的东西吗? 再顶起来看看,找个明白人 先学会fat32文件系统的结构。以及如何用c描述出来。看别人的不如自己写。
难度不亚于你之前做过的所有。 不懂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文件大小确定。 楼主是要做快速数据存储吗,所以怕文件系统太费时了?
我觉得这样的话好像就不能随便向SD卡中再写信的文件了,就只有一个TXT文件,这样就比较简单。 回复【8楼】yiminglei BI7KMT
-------------------------------------------------------------------
我是准备直接在电脑里给SD建立两个txt,然后以后就只读或是删除这两个txt,有问题吗? 回复【9楼】hdd961140543 阿逸
-----------------------------------------------------------------------
实在不行了,就只有这样了,只要一个文件,只可以往里写数据,不能新建。 回复【11楼】yuanwei703
-----------------------------------------------------------------------
如果要新建的话,就必须得文件系统才行。
我也打算用SD卡来做存储器,而且要求速度很快才行,需要在电脑上可以方便查看,就想到了楼主你的方式。
不过还没有实际开始试验,但可行性挺高的。 回复【楼主位】june2008
-----------------------------------------------------------------------
楼主啊,我也想学习一下这方面,有什么经验或资料共享一下啊,呵呵 标记 mark 你的思路我觉得可行,但是我没有试验过:
1,先建立一个内容较大的文本文件(内容全是0h)
2,利用WinHex找处此文件的数据储存地址,
3,mcu对此sd卡直接进行读写
4,注意写的内容不要大于原文本文件即可
原理我觉得和一些木马或者病毒程序生成下载者程序差不多.{:biggrin:} 以后有空再做试验测试一下.
页:
[1]