大家过来看一看。
时间:10-02
整理:3721RD
点击:
我写了一个在内存卡中读取数据并发送的程序,程序编译没有任何错误,但是一下载到STM32中串口就发送系统错误的信息。
>>>>>>>>>>>>>>>>>>>>>>>SYSTEM ERROR<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>SYSTEM ERROR<<<<<<<<<<<<<<<<<<<<<<<<<<(类似于这样的)
下面是我写的程序,请大神帮忙看一下是哪里错误了。非常纠结啊,哪怕是一点我没有考虑到的方面的提示也会让我受益不尽的。谢谢了。程序如下:(没有发送数据,只是读取数据也会这样)(结构体在.h文件中,我就不发了)
Send_Buf *Buf;
///BYTE Data[1000];
FATFS Datafs; //空白卷文件
FIL Datafsrc; //空白文件
FRESULT Datares;
//返回字节数?
long GetDatalen(char *filename) //
{
unsigned int mybw;
long datalen=0;
int i; char jres,tres,bres;
unsigned char j;
unsigned char Buffer[1000]; char tmp_name[30];
char *jpg="JPG";char *txt="TXT";char *bmp="BMP";
jres=memcmp(Buf->fileExtension,jpg,3);
tres=memcmp(Buf->fileExtension,txt,3);
bres=memcmp(Buf->fileExtension,bmp,3);
sprintf((char*)tmp_name,"0:%s",filename);
// BYTE *Datadress;
//Datadress=Data;
//sprintf((char*)tmp_name,Buf->FileName,filename);
f_mount(1,&Datafs);
Datares=f_open( &Datafsrc ,tmp_name,FA_OPEN_EXISTING||FA_READ);
if(jres==0)
{
while(1)
{
Datares=f_read(&Datafsrc,Buffer,1000,&mybw);
for(i=0;i<1000;i++)
{
if(i>=1 && i<=1000)
{
datalen++;
if(Buffer[i-1]==0XFF && Buffer[i]==0XD9)
break;
}
}
}
}else if(bres==0||tres==0)
{
while(1)
{
for(;;)
{
datalen++;
Datares=f_read(&Datafsrc,&j,1,&mybw);
if(Datares||mybw==0)
break;
}
}
}
f_close(&Datafsrc);
return datalen;
}
//为了支持多文件兼容,这里设定统一的标准,
//文件名为小写字母和数字的合体
//扩展名为大写格式,中间为点
//其中输入为文件名称(包括文件名,扩展名在内)
//对文件数据进行整理
//主要是不知道怎么在结构体中设置不定长度的数组
void SendDataReady(char* filename)
{
//char *name
long filelen;
char i=0;
unsigned int j;
//char ExtensionBuf[3];
//sscanf((const char*)filename, "%[1-9a-z]", Buf->FileName); //对文件名进行赋值
// sscanf((const char*)filename, "%[A-Z]",Buf->fileExtension); //对扩展名进行赋值
sscanf(filename, "%[^.]", Buf->FileName); //对文件名进行赋值 (成功)
sscanf(filename, "%*[^.].%s",Buf->fileExtension); //对扩展名进行赋值 (成功)
//文件名截取
LCD_Str_O_P(300, 10, "char ready", 0);
Buf->FileNameLen[0]=5;
Buf->FileNameLen[1]=5; //数组赋值采用地址
filelen=GetDatalen(filename); //得到文件的长度
i=(char)(filelen/1000);
j=(int)(filelen/1000);
Buf->Segment=i;
Buf->DataLen[0]=j;Buf->DataLen[1]=j;
if(i==1){
Buf->Segment_label[0]=0x00;
Buf->Segment_label[1]=0x00;
}
else if(i>1){
Buf->Segment_label[0]=0xff;
Buf->Segment_label[1]=0xff;
}
LCD_Str_O_P(300, 10, "structready", 0);
//Buf->Segment_label[0]=i;
//Buf->Segment_label[1]=i;
}
///Buffer段从零开始
void SendData(char* filename)
{
int i=0,j;
unsigned char Buffer[1024];
// unsigned char buffer[1000]; LCD_Str_CH_P
unsigned int mybw;
char tmp_name[20];
sprintf((char*)tmp_name,"0:%s",filename);
SendDataReady(filename);
// LCD_Str_O_P(300, 10, "num", 0);
// LCD_Str_CH_P(260,10,"计算出字节数",0);
Buffer[0]=(unsigned char)Buf->fileExtension[0]; //这样的字符转换
Buffer[1]=(unsigned char)Buf->fileExtension[1];
Buffer[2]=(unsigned char)Buf->fileExtension[2];
Buffer[3]=Buf->Segment_label[0];
Buffer[4]=Buf->Segment_label[1];
Buffer[7]=Buf->FileNameLen[0];
Buffer[8]=Buf->FileNameLen[1];
Buffer[9]=(unsigned char)Buf->FileName[0];
Buffer[10]=(unsigned char)Buf->FileName[1];
Buffer[11]=(unsigned char)Buf->FileName[2];
Buffer[12]=(unsigned char)Buf->FileName[3];
Buffer[13]=(unsigned char)Buf->FileName[4];
// LCD_Str_CH_P(240,10,"缓冲区赋值成功",0);
// LCD_Str_O_P(300, 10, "Buffer ready", 0);
f_mount(1,&Datafs);
Datares=f_open(&Datafsrc,tmp_name,FA_READ);
if(Datares==FR_OK)
{
//LCD_Str_CH_P(260,10,"成功打开文件",0);
LCD_Str_O_P(300, 10, "openfile", 0);
for(;;)
{
//这里分段是从i=0开始
if(i<Buf->Segment) //如果分段不满
{
j=1000;
Buffer[14]=j&0x00ff;
Buffer[15]=(j>>8)&0x00ff;
Buffer[16]=Buffer[14];
Buffer[17]=Buffer[17];
Datares=f_read(&Datafsrc,&Buffer[18],1000,&mybw);
// USART1_printf(USART1,"%s",Buffer);//发送mms
Buffer[5]=i;
Buffer[5]=i; //到这里,Buffer的头部分已经准备好了
}
if(i==Buf->Segment) //如果分段满 5, 0,1,2,3,4,5 实际有六段,5段为满1000的,最后一段为不满1000的
{ //这时候DataLen[0]=5,假如Buffer=5800,那么,满1000的有5段,不满1000的为最后一段
Buffer[14]=Buf->DataLen[1]&0x00ff;
Buffer[15]=(Buf->DataLen[1]>>8)&0x00ff;
Buffer[16]=Buffer[14];
Buffer[17]=Buffer[17];
Datares=f_read(&Datafsrc,&Buffer[18],Buf->DataLen[0],&mybw);
// USART1_printf(USART1,"%s",Buffer);
break;
// for()
}
i++;
}
}
f_close(&Datafsrc);
}
>>>>>>>>>>>>>>>>>>>>>>>SYSTEM ERROR<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>SYSTEM ERROR<<<<<<<<<<<<<<<<<<<<<<<<<<(类似于这样的)
下面是我写的程序,请大神帮忙看一下是哪里错误了。非常纠结啊,哪怕是一点我没有考虑到的方面的提示也会让我受益不尽的。谢谢了。程序如下:(没有发送数据,只是读取数据也会这样)(结构体在.h文件中,我就不发了)
Send_Buf *Buf;
///BYTE Data[1000];
FATFS Datafs; //空白卷文件
FIL Datafsrc; //空白文件
FRESULT Datares;
//返回字节数?
long GetDatalen(char *filename) //
{
unsigned int mybw;
long datalen=0;
int i; char jres,tres,bres;
unsigned char j;
unsigned char Buffer[1000]; char tmp_name[30];
char *jpg="JPG";char *txt="TXT";char *bmp="BMP";
jres=memcmp(Buf->fileExtension,jpg,3);
tres=memcmp(Buf->fileExtension,txt,3);
bres=memcmp(Buf->fileExtension,bmp,3);
sprintf((char*)tmp_name,"0:%s",filename);
// BYTE *Datadress;
//Datadress=Data;
//sprintf((char*)tmp_name,Buf->FileName,filename);
f_mount(1,&Datafs);
Datares=f_open( &Datafsrc ,tmp_name,FA_OPEN_EXISTING||FA_READ);
if(jres==0)
{
while(1)
{
Datares=f_read(&Datafsrc,Buffer,1000,&mybw);
for(i=0;i<1000;i++)
{
if(i>=1 && i<=1000)
{
datalen++;
if(Buffer[i-1]==0XFF && Buffer[i]==0XD9)
break;
}
}
}
}else if(bres==0||tres==0)
{
while(1)
{
for(;;)
{
datalen++;
Datares=f_read(&Datafsrc,&j,1,&mybw);
if(Datares||mybw==0)
break;
}
}
}
f_close(&Datafsrc);
return datalen;
}
//为了支持多文件兼容,这里设定统一的标准,
//文件名为小写字母和数字的合体
//扩展名为大写格式,中间为点
//其中输入为文件名称(包括文件名,扩展名在内)
//对文件数据进行整理
//主要是不知道怎么在结构体中设置不定长度的数组
void SendDataReady(char* filename)
{
//char *name
long filelen;
char i=0;
unsigned int j;
//char ExtensionBuf[3];
//sscanf((const char*)filename, "%[1-9a-z]", Buf->FileName); //对文件名进行赋值
// sscanf((const char*)filename, "%[A-Z]",Buf->fileExtension); //对扩展名进行赋值
sscanf(filename, "%[^.]", Buf->FileName); //对文件名进行赋值 (成功)
sscanf(filename, "%*[^.].%s",Buf->fileExtension); //对扩展名进行赋值 (成功)
//文件名截取
LCD_Str_O_P(300, 10, "char ready", 0);
Buf->FileNameLen[0]=5;
Buf->FileNameLen[1]=5; //数组赋值采用地址
filelen=GetDatalen(filename); //得到文件的长度
i=(char)(filelen/1000);
j=(int)(filelen/1000);
Buf->Segment=i;
Buf->DataLen[0]=j;Buf->DataLen[1]=j;
if(i==1){
Buf->Segment_label[0]=0x00;
Buf->Segment_label[1]=0x00;
}
else if(i>1){
Buf->Segment_label[0]=0xff;
Buf->Segment_label[1]=0xff;
}
LCD_Str_O_P(300, 10, "structready", 0);
//Buf->Segment_label[0]=i;
//Buf->Segment_label[1]=i;
}
///Buffer段从零开始
void SendData(char* filename)
{
int i=0,j;
unsigned char Buffer[1024];
// unsigned char buffer[1000]; LCD_Str_CH_P
unsigned int mybw;
char tmp_name[20];
sprintf((char*)tmp_name,"0:%s",filename);
SendDataReady(filename);
// LCD_Str_O_P(300, 10, "num", 0);
// LCD_Str_CH_P(260,10,"计算出字节数",0);
Buffer[0]=(unsigned char)Buf->fileExtension[0]; //这样的字符转换
Buffer[1]=(unsigned char)Buf->fileExtension[1];
Buffer[2]=(unsigned char)Buf->fileExtension[2];
Buffer[3]=Buf->Segment_label[0];
Buffer[4]=Buf->Segment_label[1];
Buffer[7]=Buf->FileNameLen[0];
Buffer[8]=Buf->FileNameLen[1];
Buffer[9]=(unsigned char)Buf->FileName[0];
Buffer[10]=(unsigned char)Buf->FileName[1];
Buffer[11]=(unsigned char)Buf->FileName[2];
Buffer[12]=(unsigned char)Buf->FileName[3];
Buffer[13]=(unsigned char)Buf->FileName[4];
// LCD_Str_CH_P(240,10,"缓冲区赋值成功",0);
// LCD_Str_O_P(300, 10, "Buffer ready", 0);
f_mount(1,&Datafs);
Datares=f_open(&Datafsrc,tmp_name,FA_READ);
if(Datares==FR_OK)
{
//LCD_Str_CH_P(260,10,"成功打开文件",0);
LCD_Str_O_P(300, 10, "openfile", 0);
for(;;)
{
//这里分段是从i=0开始
if(i<Buf->Segment) //如果分段不满
{
j=1000;
Buffer[14]=j&0x00ff;
Buffer[15]=(j>>8)&0x00ff;
Buffer[16]=Buffer[14];
Buffer[17]=Buffer[17];
Datares=f_read(&Datafsrc,&Buffer[18],1000,&mybw);
// USART1_printf(USART1,"%s",Buffer);//发送mms
Buffer[5]=i;
Buffer[5]=i; //到这里,Buffer的头部分已经准备好了
}
if(i==Buf->Segment) //如果分段满 5, 0,1,2,3,4,5 实际有六段,5段为满1000的,最后一段为不满1000的
{ //这时候DataLen[0]=5,假如Buffer=5800,那么,满1000的有5段,不满1000的为最后一段
Buffer[14]=Buf->DataLen[1]&0x00ff;
Buffer[15]=(Buf->DataLen[1]>>8)&0x00ff;
Buffer[16]=Buffer[14];
Buffer[17]=Buffer[17];
Datares=f_read(&Datafsrc,&Buffer[18],Buf->DataLen[0],&mybw);
// USART1_printf(USART1,"%s",Buffer);
break;
// for()
}
i++;
}
}
f_close(&Datafsrc);
}
我的也是这样啊!SD卡已经格式化成FAT 32了,可是还是不行啊!