初级会员

- 积分
- 51
- 金钱
- 51
- 注册时间
- 2014-9-14
- 在线时间
- 7 小时
|

楼主 |
发表于 2015-4-5 20:01:45
|
显示全部楼层
回复【5楼】huangchangxin10:
---------------------------------
回复【2楼】正点原子:
---------------------------------现在找到个好一点的办法,就是用去除那些跳变得厉害的的经纬度,然后这样
//显示GPS定位信息
void Gps_Msg_Show(void)
{
float tp;
tp=gpsx.longitude;
xianzai_jingdu=tp/100000.00000;//记录当前经度,东经多少度?
if(((fabs(xianzai_jingdu-sheding_jingdu))>0.0018)&&(sheding_jingdu!=0)) //预防错误的发生,判断是不是超过了0.01度经度,如果是则把前一个正确的结果赋给xianzai_jingdu
{
xianzai_jingdu=previous_jingdu;
}
previous_jingdu=xianzai_jingdu; //记录先前的经度,方便处理错误的经度值(由于GPS存在有时候定位不了的错误)
sprintf((char *)dtbuf,"Longitude:%.5f %1c ",tp/=100000,gpsx.ewhemi); //得到经度字符串
LCD_ShowString(30,130,dtbuf,BLACK,BLUE);
tp=gpsx.latitude;
xianzai_weidu=tp/100000.00000; //记录当前纬度值,北纬多少度?
if(((fabs(xianzai_weidu-sheding_weidu))>0.0018)&&(sheding_weidu!=0))
{
xianzai_weidu=previous_weidu; //如果现在纬度和设定的纬度差值大于0.0018说明现在纬度值无效,把以前的值赋给xianzai_weidu
}
previous_weidu=xianzai_weidu; //记录先前的纬度,方便处理错误的纬度值。
sprintf((char *)dtbuf,"Latitude:%.5f %1c ",tp/=100000,gpsx.nshemi); //得到纬度字符串
LCD_ShowString(30,150,dtbuf,BLACK,BLUE);
tp=gpsx.altitude;
sprintf((char *)dtbuf,"Altitude:%.1fm ",tp/=10); //得到海拔高度
LCD_ShowString(30,170,dtbuf,BLACK,BLUE);
tp=gpsx.speed;
sprintf((char *)dtbuf,"Speed:%.3fkm/h ",tp/=1000); //得到速度字符串
LCD_ShowString(30,190,dtbuf,BLACK,BLUE);
if(gpsx.fixmode<=3) //定位状态
{
sprintf((char *)dtbuf,"Fix Mode:%s",fixmode_tbl[gpsx.fixmode]);
LCD_ShowString(30,210,dtbuf,BLACK,BLUE);
}
sprintf((char *)dtbuf,"Valid satellite:%02d",gpsx.posslnum); //用于定位的卫星数目
LCD_ShowString(30,230,dtbuf,BLACK,BLUE);
sprintf((char *)dtbuf,"Visible satellite:%02d",gpsx.svnum%100); //可见卫星数
LCD_ShowString(30,250,dtbuf,BLACK,BLUE);
sprintf((char *)dtbuf,"UTC Date:%04d/%02d/%02d ",gpsx.utc.year,gpsx.utc.month,gpsx.utc.date); //显示UTC日期
//printf("year2:%d\r\n",gpsx.utc.year);
LCD_ShowString(30,270,dtbuf,BLACK,BLUE);
sprintf((char *)dtbuf,"UTC Time:%02d:%02d:%02d ",gpsx.utc.hour,gpsx.utc.min,gpsx.utc.sec); //????UTC?±??
LCD_ShowString(30,290,dtbuf,BLACK,BLUE);
//显示设定经纬度(停车位置)
sprintf((char *)dtbuf,"sheding jingdu:%.5f %1c ",sheding_jingdu,'N'); //得到经度字符串
LCD_ShowString(30,0,dtbuf,BLACK,BLUE);
sprintf((char *)dtbuf,"sheding weidu:%.5f %1c ",sheding_weidu,'E'); //得到纬度字符串
LCD_ShowString(30,16,dtbuf,BLACK,BLUE);
//显示设定值和当前值的差值
sprintf((char *)dtbuf,"chazhi jingdu:%.5f %1c ",fabs(sheding_jingdu-xianzai_jingdu),'N'); //fabs为取绝对值的函数,得到经度差值
LCD_ShowString(30,32,dtbuf,RED,BLUE);
sprintf((char *)dtbuf,"chazhi weidu:%.5f %1c ", fabs(sheding_weidu-xianzai_weidu),'E'); //fabs为取绝对值的函数,得到纬度差值
LCD_ShowString(30,48,dtbuf,RED,BLUE);
//计算并显示当前的车辆位置和设定的位置之间的距离
Distance1=fabs(sheding_jingdu-xianzai_jingdu)*100353.16000; //经度相差1度,为100353.16000米
sprintf((char *)dtbuf,"Distan1_E:%.5f %1c ",Distance1,'m'); //得到经度字符串
LCD_ShowString(30,64,dtbuf,GREEN,BLUE);
Distance2=fabs(sheding_weidu-xianzai_weidu)*111000.00000;//纬度相差一度为111000.00000米,由纬度算出来的值,单位为米
sprintf((char *)dtbuf,"Distan2_N:%.5f %1c ",Distance2,'m'); //得到纬度字符串
LCD_ShowString(30,80,dtbuf,GREEN,BLUE);
LCD_ShowString(30,96,"GSM&&GPS BY WEI CHANG MAO",BLACK,BLUE);
//GPs_count();
//LCD_ShowString(30,112," ",BLACK,BLUE);
//if((xianzai_jingdu>(sheding_jingdu+xianzhi))||(xianzai_jingdu<(sheding_jingdu-xianzhi))||(xianzai_weidu>(sheding_weidu+xianzhi))||(xianzai_weidu<(sheding_weidu-xianzhi)))
if(Distance1>30||Distance2>30) //实际测量值测量值,有待测量.
{
// if(send_flag==1)
// {
// sim900a_sms_send_test();
// send_flag=0; //报警标志置0,只发一次短信就不再发送,信息费好贵的说
// }
for(t=0;t<10;t++)
{
led=!led;
delay_ms(500);
}
}
else
{
led=1;
beep=0;
}
delay_ms(100);
/* current=sim900a_sms_read_num(); //获取当前的短信数目
if(current==previous) //当前的短信数目和以前的短信数目比较,数目不变,不读取短信,else读取短信
{
//不读取短信
}
else //短信增加了,读取短信内容并判断,是否是车主发的
{
//读取短信并判断内容
table_current[0]=current/10+'0';
table_current[1]=current%10+'0';
table_current[2]='\0';
sim900a_sms_read_test(table_current);
previous=current; //改变短信数目。标记新短信已经读过了
}
*/
} 那些注释掉的是为了方便调试GPS,所以把GSM部分注释掉了 |
|