//显示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++;
}
}
|