OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3224|回复: 1

GPS+文件系统的一个bug,请问原子哥怎么处理,具体贴出代码

[复制链接]

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2015-11-8
在线时间
31 小时
发表于 2016-2-21 11:39:50 | 显示全部楼层 |阅读模式
2金钱
//显示GPS定位信息
void Gps_Msg_Show(void)
{
  float tp;   
BACK_COLOR=YELLOW  ;
POINT_COLOR=BLUE;   
tp=gpsx.longitude;   
sprintf((char *)dtbuf,"%.5f %1c   ",tp/=100000,gpsx.ewhemi); //得到经度字符串
  LCD_ShowString(100,130,200,16,16,dtbuf);      
tp=gpsx.latitude;   
sprintf((char *)dtbuf,"%.5f %1c   ",tp/=100000,gpsx.nshemi); //得到纬度字符串
  LCD_ShowString(100,150,200,16,16,dtbuf);   
tp=gpsx.altitude;   
  sprintf((char *)dtbuf,"%.1fm     ",tp/=10);        //得到高度字符串
  LCD_ShowString(100,170,200,16,16,dtbuf);        
tp=gpsx.speed;   
  sprintf((char *)dtbuf,"%.3fkm/h     ",tp/=1000);        //得到速度字符串  
  LCD_ShowString(100,190,200,16,16,dtbuf);         
if(gpsx.fixmode<=3)              //定位状态
{  
  sprintf((char *)dtbuf,"%s",fixmode_tbl[gpsx.fixmode]);
    LCD_ShowString(100,210,200,16,16,dtbuf);
}      
sprintf((char *)dtbuf,"%02d",gpsx.posslnum);    //用于定位的卫星数
  LCD_ShowString(100,230,200,16,16,dtbuf);     
sprintf((char *)dtbuf,"%02d",gpsx.svnum%100);    //可见卫星数
// LCD_ShowString(100,260,200,16,16,dtbuf);   
sprintf((char *)dtbuf,"%04d-%02d-%02d   ",gpsx.utc.year,gpsx.utc.month,gpsx.utc.date); //显示UTC日期
LCD_ShowString(100,250,200,16,16,dtbuf);      
sprintf((char *)dtbuf,"%02d:%02d:%02d   ",gpsx.utc.hour+8,gpsx.utc.min,gpsx.utc.sec); //显示UTC时间
  LCD_ShowString(100,270,200,16,16,dtbuf);   
}

int main(void)
{
u16 j=0;
u32 r=0;//记录坐标数

u8 temp[24];
  
u8 TX_BF[65];
u8 fontx[2];//gbk码
u16 i,rxlen;
u16 lenx;
u8 key;
u8 key1=0XFF;
u8 record=0;
u32  fontcnt;
delay_init();       //延时函数初始化   
uart_init(38400);   //串口初始化为38400
USART2_Init(38400); //初始化串口2
Ublox_Cfg_Prt(38400);   //重新设置模块的波特率为38400
LED_Init();    //初始化与LED连接的硬件接口
KEY_Init();    //初始化与LED连接的硬件接口
  LCD_Init();    //初始化LCD
mem_init();//初始化内部内存池
exfuns_init();//为fatfs系统文件申请内存
  f_mount(fs[0],"0:",1);  //挂载SD卡
  f_mount(fs[1],"1:",1);  //挂载FLASH.
while(font_init())  //检查字库
{ while(SD_Initialize())  //检测SD卡,,如果执行此条语句,说明SD失败
  {
   printf("SD Card Failed!");     
  }
  }
SDFont_Init();
//
//如果之前有记录,重新上电先算出之前记录的条数,非常重要
  f_open(file, "0:/GPS_log.txt", FA_READ );
r=(*file).fsize/64;
f_close(file);    //关闭文件
// printf("\x0c\0");printf("\x0c\0");//超级终端清屏
// printf("\033[1;40;32m");//设置超级终端背景为黑色,字符为绿色
  POINT_COLOR=RED;
BACK_COLOR=GREEN;

  LCD_ShowString(30,110,200,16,16,"NMEA Data Upload:OFF");   
Show_Str(20,130,200,16,"     经度:",16,0);         
Show_Str(20,150,200,16,"     纬度:",16,0);
Show_Str(20,170,200,16,"     海拔:",16,0);  
Show_Str(20,190,200,16,"     速度:",16,0);           
Show_Str(20,210,200,16," 定位类型:",16,0);  
Show_Str(20,230,200,16," 有效卫星:",16,0);         
Show_Str(20,250,200,16,"     日期:",16,0);  
Show_Str(20,270,200,16,"     时间:",16,0);
Show_Str(20,290,200,16," 记录坐标:",16,0);//显示记录坐标信息数

//  /************************我的bug就出现在了这段代码中**************************************************
//    加上去后SD卡写入就会报错,我也不知道为啥,不加上去gps就有时无法正常工作,这两者无法同时存在啊、做过这方面的牛牛出来帮下
//  
//  ******************************************************************************/
if(Ublox_Cfg_Rate(1000,1)!=0) //设置定位信息更新速度为1000ms,顺便判断GPS模块是否在位.
// {
//   LCD_ShowString(30,110,200,16,16,"NEO-6M Setting...");

// while((Ublox_Cfg_Rate(1000,1)!=0)&&key1) //持续判断,直到可以检查到NEO-6M,且数据保存成功
//  {
//    USART2_Init(9600);   //初始化串口2波特率为9600(EEPROM没有保存数据的时候,波特率为9600.)
//      Ublox_Cfg_Prt(38400);   //重新设置模块的波特率为38400
//   Ublox_Cfg_Tp(1000000,100000,1); //设置PPS为1秒钟输出1次,脉冲宽度为100ms     
//   key1=Ublox_Cfg_Cfg_Save();  //保存配置  
//  }         
//   LCD_ShowString(30,110,200,16,16,"NEO-6M Set Done!!");
//  delay_ms(500);
//  LCD_Fill(30,110,30+200,110+16,WHITE);//清除显示 对顶角的两个坐标
// }














while(1)
{
  sprintf(temp,"%d",r);//记录坐标数
    BACK_COLOR=YELLOW  ;   
  LCD_ShowString (100,290,200,16,16,temp);
  delay_ms(1);
//  if(USART2_RX_STA&0X8000)  //接收到一次数据了
//  {
//   rxlen=USART2_RX_STA&0X7FFF; //得到数据长度
//   for(i=0;i<rxlen;i++)USART1_TX_BUF[i]=USART2_RX_BUF[i];   
//    USART2_RX_STA=0;      //启动下一次接收
//   USART1_TX_BUF[i]=0;   //自动添加结束符
//    GPS_Analysis(&gpsx,(u8*)USART1_TX_BUF);//分析字符串
//   Gps_Msg_Show();    //显示信息
//   }
   if(USART2_RX_STA&0X8000)  //接收到一次数据了
  {
    USART2_RX_STA=0;      //启动下一次接收
   GPS_Analysis(&gpsx,(u8*)USART2_RX_BUF);//分析字符串
   Gps_Msg_Show();    //显示信息
   }
if(j==1000)   //大约2s记录一次
  {
   j=0;
   if(record)
   {
    r++;//自动加1
  
        printf("记录%03d 自动 ",r);   //写序号  
      printf("%04d-%02d-%02d ",gpsx.utc.year,gpsx.utc.month,gpsx.utc.date); //日期   
    printf("%02d:%02d:%02d ",gpsx.utc.hour+8,gpsx.utc.min,gpsx.utc.sec); //时间
    printf("%1c%02d°%02.4f',",gpsx.nshemi,gpsx.latitude/100000,gpsx.latitude%100000/100000.0*60.0); //得到纬度字符串
     printf("%1c%03d°%03.4f' ",gpsx.ewhemi,gpsx.longitude/100000,gpsx.longitude%100000/100000.0*60.0+10); //得到纬度字符串
    /*           传送gps解码                                   */
     // printf("\r\n %s\r\n",USART1_TX_BUF);
      printf("\r\n");  //回车换行
    printf("\r\n");
   //打印至SD卡
   //写文件测试
        
   
   
     f_lseek(file,(*file).fsize); //移动指针
    f_printf(file,"记录%03d 自动 ",r);   //写序号
    sprintf(temp,"%04d-%02d-%02d ",gpsx.utc.year,gpsx.utc.month,gpsx.utc.date); //日期
    f_write(file,temp,11,&br);  //日期
    sprintf(temp,"%02d:%02d:%02d ",gpsx.utc.hour+8,gpsx.utc.min,gpsx.utc.sec); //时间
    f_write(file,temp,9,&br);   //时间
    sprintf(temp,"%1c%02d°%02.4f',",gpsx.nshemi,gpsx.latitude/100000,gpsx.latitude%100000/100000.0*60.0); //得到纬度字符串
    f_write(file,temp,14,&br);   //纬度  
    sprintf(temp,"%1c%03d°%02.4f' ",gpsx.ewhemi,gpsx.longitude/100000,gpsx.longitude%100000/100000.0*60.0+10); //得到纬度字符串
    f_write(file,temp,15,&br);   //经度  
    f_printf(file,"\r\n");  //回车换行
   

   
   }
  }
  j++;
  key=KEY_Scan(0);
   
  if(key==KEY0_PRES)  //开始功能,record初始化时为0,key0
  {
   record=!record;
   POINT_COLOR=RED;
   if(record)LCD_ShowString(30,110,200,16,16,"NMEA Data Upload:ON ");
   else LCD_ShowString(30,110,200,16,16,"NMEA Data Upload:OFF");
   if(record)
   {
   printf("开始\r\n");
   Show_Str(150,290,80,16,"开始",16,0);}
   else
   {
   printf("停止\r\n");
   Show_Str(150,290,80,16,"停止",16,0);
   }
    if(!record)
    {
      f_close(file);    //关闭文件
     }
     else
     {   
      
            f_open(file, "0:/GPS_log1.gtxt", FA_CREATE_ALWAYS | FA_WRITE);//以写的方式打开,如果不存在则新建
         //写文件测试
     printf("write file test......\n\r");
     res = f_open(file, "0:/longfilenametest6.gtxt", FA_CREATE_ALWAYS | FA_WRITE);
  
    if(res != FR_OK){
   printf("open file error : %d\n\r",res);
    }  else{
       res = f_write(file, textFileBuffer, sizeof(textFileBuffer ), &bw);               /* Write it to the dst file */
        if(res == FR_OK){
         printf("write data ok! %d\n\r",bw);
                         }else{
         printf("write data error : %d\n\r",res);
                              }
  /*close file */
  f_close(file);
}
     }
    }   
   if(key==KEY1_PRES)//KEY1使清零操作
   {  
      printf("清零\r\n");
      Show_Str(150,290,80,16,"清零",16,0);
     if(record) //开始
     {
      record=0;
  
     }
     r=0;
     BACK_COLOR=YELLOW;
     LCD_ShowString(100,290,72,16,16,"         ");                     
     f_unlink("0:/GPS_log.txt");     //要不要先关闭再删除 r=0;
     
   }
   if(key==WKUP_PRES)//上传
   
    {
       printf("上传\r\n");  
       Show_Str(150,290,80,16,"上传数据库",16,0);
     f_close(file);            //如果在记录中点击上传,要先关闭文件
     res=f_open(file, "0:/GPS_log.gtxt", FA_READ );
     if(res)
     {
      i=2;
      while(i--)
      {
       BACK_COLOR=BLACK;
       Show_Str(150,290,80,16,"记录不存在",16,0);
       delay_ms(100);      
       LCD_Fill(150,290,150+80,290+16,BLACK);//清除显示      
       delay_ms(100);
      }
     }
     else
     {
      POINT_COLOR=YELLOW;                        
      LCD_DrawRectangle(9,10,121,26);   //画进度条的矩形
      POINT_COLOR=BLUE;
      BACK_COLOR=BLACK;         
      for(i=0;i<r;i++)   
      {      
       f_lseek(file,64*i); //移动指针           
       f_gets(TX_BF,63,file);
      //f_read(file,TX_BUF,63,&br);  //能实现和f_gets相同的效果      
       printf("%s\r\n",TX_BF);
       sprintf(temp,"%3.0f%%",(float)(i+1)/r*100.0);
       //LCD_ShowString(220,380,32,16,16,temp);          //显示进度百分比
       LCD_ShowString(20,18,32,16,16,temp);          //显示进度百分比
       LCD_Fill(10,11,110+(float)(i+1)/r*100.0,25,BLUE);//画进度条
      }i=2;
      while(i--)
      {
       //LCD_ShowString(220,380,32,16,16,temp);
        LCD_ShowString(20,18,32,16,16,temp);          //显示进度百分比
         delay_ms(100);      
       //LCD_Fill(220,380,252,396,BLACK);//清除显示  
                LCD_Fill(20,18,20+32,18+16,RED);   //清除显示     
       delay_ms(100);
      }     
      LCD_Fill(0,380,320,396,BLACK);
      if(!record)
       f_close(file);            //关闭文件
      else
      {
       f_open(file, "0:/GPS_log.gtxt", FA_WRITE );
      }
     }
     }
   if((lenx%500)==0)
  LED0=!LED0;
    LED1=!LED1;  
lenx++;
}               
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-2-21 22:53:28 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 01:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表