原创
GPS串口数据解码程序
2009-9-20 20:52
5700
3
4
分类:
智能手机
bit ReceivingF = 0;
bit EndF = 0;
bit RMCF = 0;
bit GGAF = 0;
bit VTGF = 0;
bit GSAF = 0;
uchar GPS_time[9]; //UTC时间
uchar xdata GPS_wd[12]; //纬度
uchar xdata GPS_jd[13]; //经度
uchar GPS_warn; //定位警告
uchar GPS_quality; //定位质量
uchar GPS_status; //定位状态
uchar GPS_alt[8]; //海拔
uchar GPS_sv[3]; //使用卫星
uchar GPS_speed[10]; //速度
uchar GPS_date[9]; //UTC日期
uchar Segment; //逗号计数
uchar Bytes_counter;
uchar Command;
void GPRMC(uchar);
void GPGGA(uchar);
void GPVTG(uchar);
void GPGSA(uchar);
void gps(uchar);
/****************************************************/
//功能:NMEA-183协议解析
//入口:void
//返回:void
//全局变更修改:GPS_*,Segment,command,Bytes_counter,NewByteF
//修改记录: 2007.8.25 创建 by 54et v1
// 2007.8.26 v1.1 修改解码结构
/****************************************************/
void gps(uchar tmp)
{
//com_send_byte(tmp);
if(tmp == '$')//起始标志
{
Command = 0;
ReceivingF = 1;
Bytes_counter = 0;
Segment = 0; //清空语句段计数器
return;
}
if(ReceivingF)
{
if(tmp == ',')
{
++Segment;
Bytes_counter = 0; //清空段字节计数器
return;
}
if(tmp == '*')//收到结束标志
{
ReceivingF = 0;
EndF = 1;
return;
}
if(Segment == 0)
{
if(Bytes_counter == 3) //段0,语句类型判断
switch(tmp)
{
case 'G':Command = 1;//语句类型 $GPGGA
GGAF = 1;
break;
case 'M':Command = 2;//语句类型 $GPRMC
RMCF = 1;
break;
case 'T':Command = 3;//语句类型 $GPVTG
VTGF = 1;
break;
case 'S':break;
default:Command = 0; //非有效数据类型,终止当前数据接收
ReceivingF = 0;
break;
}
if(Bytes_counter == 4)
if(Command==0 && tmp=='A')
{
Command = 4;//语句类型 $GPGSA
GSAF = 1;
}
}
else
{
switch(Command)
{
case 1:GPGGA(tmp);
break;
case 2:GPRMC(tmp);
break;
case 3:GPVTG(tmp);
break;
case 4:GPGSA(tmp);
break;
default:break;
}
}
++Bytes_counter;
}
NewByteF = 0;
return;
}
void GPGGA(uchar tmp)
{
switch(Segment)
{
case 1: if(Bytes_counter == 2 || Bytes_counter == 5) //$GPGGA段1,UTC时间,hhmmss(时分秒)格式,取前6位 转换为HH:MM:SS格式
{
GPS_time[Bytes_counter] = ':';
++Bytes_counter;
}
if(Bytes_counter<8)
GPS_time[Bytes_counter] = tmp;
GPS_time[8] = '\0';
break;
case 2: if(Bytes_counter == 3) //$GPGGA 段2处理 纬度ddmm.mmmm(度分)格式
{
GPS_wd[Bytes_counter] = '.'; //接收第二个字节后插入'.'
++Bytes_counter;
GPS_wd[11] = '\0';
}
if(Bytes_counter == 0)
++Bytes_counter;
GPS_wd[Bytes_counter] = tmp;
break;
case 3: GPS_wd[0] = tmp; //$GPGGA第3段处理 纬度半球N(北半球)或S(南半球)
break;
case 4: if(Bytes_counter == 4) //$GPGGA 段4处理 经度dddmm.mmmm(度分)格式
{
GPS_jd[Bytes_counter] = '.'; //接收第3个字节后插入'.'
++Bytes_counter;
GPS_jd[12] = '\0';
}
if(Bytes_counter == 0)
++Bytes_counter;
GPS_jd[Bytes_counter] = tmp;
break;
case 5: GPS_jd[0] = tmp; //$GPGGA第5段处理 经度半球E(东经)或W(西经)
break;
case 6: GPS_quality = tmp;
break;
case 7: if(Bytes_counter<2) //$GPGGA第7段处理 正在使用解算位置的卫星数量(00~12)(前面的0也将被传输)
GPS_sv[Bytes_counter] = tmp;
GPS_sv[2] = '\0';
break;
case 9: if(Bytes_counter<7) //$GPGGA第9段处理 海拔高度(-9999.9~99999.9)
{
GPS_alt[Bytes_counter] = tmp;
GPS_alt[Bytes_counter+1] = '\0';
}
break;
default:break;
}
}
void GPRMC(uchar tmp)
{
switch(Segment)
{
case 9: if(Bytes_counter<2) //$GPRMC第9段处理 UTC日期,ddmmyy(日月年)格式转换为yy-mm-dd
{
GPS_date[6+Bytes_counter] = tmp;
}
if(Bytes_counter>1 && Bytes_counter<4)//月
{
GPS_date[1+Bytes_counter] = tmp;
GPS_date[5] = '-';
}
if(Bytes_counter>3 && Bytes_counter<6)//年
{
GPS_date[Bytes_counter-4] = tmp;
GPS_date[2] = '-';
GPS_date[8] = '\0';
}
break;
default:break;
}
}
void GPGSA(uchar tmp)
{
switch(Segment)
{
case 2: GPS_status = tmp; //$GPGSA第2段处理 定位类型,1=没有定位,2=2D定位,3=3D定位
break;
default:break;
}
}
void GPVTG(uchar tmp)
{
switch(Segment)
{
case 7:if(Bytes_counter < 7)//地面速率(0000.0~1851.8公里/小时,前面的0也将被传输)
{
GPS_speed[Bytes_counter] = tmp;
GPS_speed[Bytes_counter+1] = '$';//这里4个字符是Km/h
GPS_speed[Bytes_counter+2] = '"';
GPS_speed[Bytes_counter+3] = '/';
GPS_speed[Bytes_counter+4] = '#';
GPS_speed[Bytes_counter+5] = '\0';
}
break;
default:break;
}
}
用户1588142 2011-6-7 10:31