ARM技术william hill官网
直播中

张聪

11年用户 9经验值
擅长:控制/MCU
私信 关注
[问答]

【stm32系统错误】大家过来看一看。

`我写了一个在内存卡中读取数据并发送的程序,程序编译没有任何错误,但是一下载到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(iSegment) //如果分段不满
    {
   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);
}

`

回帖(1)

凯哥

2013-3-14 08:10:29
我的也是这样啊!!SD卡已经格式化成FAT 32了,可是还是不行啊!!!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分