NMEA-0183之$GPRMC数据处理
|
副标题[/!--empirenews.page--]
NMEA-0183 u?以下为GPS芯片串口发出的数据: 201512_15:42:3712,$GPTXT,ANTSTATUS=SHORT*43 ? u?数据接收: GPRMC格式,数据长度不会超过70; GPGGA格式,数据长度不会超过72; ??以’$’开始保存,若长度超过74则丢弃并重新接收,否则判断结束符r’’n’; ??首次收到’则向GPS芯片发送模式(GPS/BD/MIX)控制命令字; ??判断GPS_RX[3、4、5]是否为’R、M、C’,是则开始处理; ? u?数据处理: ??判断锁定位; ??时间:小时要+8,若>24则需-24; ??日期:需修正 static void DateRepair(void)
{
uint8 day_tmp,mon_tmp,year_tmp; // 日,月,年暂存
year_tmp = ((gps_data.date_time[0] >> 4) * 10) + (gps_data.date_time[0] & 0xf);
mon_tmp = ((gps_data.date_time[1] >> 4) * 10) + (gps_data.date_time[1] & 0xf);
day_tmp = ((gps_data.date_time[2] >> 4) * 10) + (gps_data.date_time[2] & 0xf);
day_tmp++;
//GPSDATA.date[0]++;
if(mon_tmp == 2) // 如果是2月份
{
if((year_tmp % 4) != 0)
{ //闰年
if(day_tmp > 28)
{ //28天
day_tmp = 1;
mon_tmp++;
}
}
else
{
if(day_tmp > 29)
{ //29天
day_tmp = 1;
mon_tmp++;
}
}
}
else if((mon_tmp == 4) || (mon_tmp == 6) || (mon_tmp == 9) || (mon_tmp == 11))
{ //4,6,11月份
if(day_tmp > 30)
{
day_tmp = 1;
mon_tmp++;
}
}
else
{
if(day_tmp > 31)
{ //1,5,7,8,12月份
day_tmp = 1;
mon_tmp++;
if(mon_tmp > 12)
{
mon_tmp = 1;
year_tmp++;
}
}
}
gps_data.date_time[0] = ((year_tmp / 10) << 4) + (year_tmp % 10); // year
gps_data.date_time[1] = ((mon_tmp / 10) << 4) + (mon_tmp % 10); // mon
gps_data.date_time[2] = ((day_tmp / 10) << 4) + (day_tmp % 10); // day
}?
??经纬度 纬度ddmm.mmmm(度分)格式(前面的0也被传输),如3021.5167=120.099786; 经度dddmm.mmmm(度分)格式(前面的0也被传输),如12005.9872=30.358613; static void longlat_sel(uint8 *pd,uint8 len)
{
uint8 j,jj,jjj;
// 先处理纬度
j = lookup(pd,',len);
if(j)
{
for(jj = 0; jj < 5; jj++)
{
if((pd[j + jj] == '.') || (pd[j + jj] == ','))
break;
}
//gps_data.latitude[0] = 0;
switch(jj)
{
case 4:
gps_data.latitude[0] = ((pd[j] & 0x0f) << 4) + (pd[j + 1] & 0x0f);
gps_data.latitude[1] = ((pd[j + 2] & 0x0f) << 4) + (pd[j + 3] & 0x0f);
break;
case 3:
gps_data.latitude[0] = pd[j] & 0x0f;
gps_data.latitude[1] = ((pd[j + 1] & 0x0f) << 4) + (pd[j + 2] & 0x0f);
break;
case 2:
gps_data.latitude[0] = 0;
gps_data.latitude[1] = ((pd[j] & 0x0f) << 4) + (pd[j + 1] & 0x0f);
break;
case 1:
gps_data.latitude[0] = 0;
gps_data.latitude[1] = pd[j] & 0x0f;
break;
default:
gps_data.latitude[0] = 0;
gps_data.latitude[1] = 0;
break;
}
jjj = lookup(pd,4,len);
switch(jjj - j - jj - 2) // 小数点后的位数
{
case 6:
case 5:
case 4:
gps_data.latitude[2] = ((pd[j + jj + 1] & 0x0f) << 4) + (pd[j + jj + 2] & 0x0f);
gps_data.latitude[3] = ((pd[j + jj + 3] & 0x0f) << 4) + (pd[j + jj + 4] & 0x0f);
break;
case 3:
gps_data.latitude[2] = ((pd[j + jj + 1] & 0x0f) << 4) + (pd[j + jj + 2] & 0x0f);
gps_data.latitude[3] = (pd[j + jj + 3] & 0x0f) << 4;
break;
case 2:
gps_data.latitude[2] = ((pd[j + jj + 1] & 0x0f) << 4) + (pd[j + jj + 2] & 0x0f);
gps_data.latitude[3] = 0;
break;
case 1:
gps_data.latitude[2] = (pd[j + jj + 1] & 0x0f) << 4;
gps_data.latitude[3] = 0;
break;
default:
gps_data.latitude[2] = 0;
gps_data.latitude[3] = 0;
break;
}
}
// 再处理经度
j = lookup(pd,len);
if(j)
{
for(jj = 0; jj < 5; jj++)
{
if((pd[j + jj] == '.') || (pd[j + jj] == ','))
break;
}
switch(jj)
{
case 5:
gps_data.longitude[0] = pd[j] & 0x0f;
gps_data.longitude[1] = ((pd[j + 1] & 0x0f) << 4) + (pd[j + 2] & 0x0f);
gps_data.longitude[2] = ((pd[j + 3] & 0x0f) << 4) + (pd[j + 4] & 0x0f);
break;
case 4:
gps_data.longitude[0] = 0;
gps_data.longitude[1] = ((pd[j] & 0x0f) << 4) + (pd[j + 1] & 0x0f);
gps_data.longitude[2] = ((pd[j + 2] & 0x0f) << 4) + (pd[j + 3] & 0x0f);
break;
case 3:
gps_data.longitude[0] = 0;
gps_data.longitude[1] = pd[j] & 0x0f;
gps_data.longitude[2] = ((pd[j + 1] & 0x0f) << 4) + (pd[j + 2] & 0x0f);
break;
case 2:
gps_data.longitude[0] = 0;
gps_data.longitude[1] = 0;
gps_data.longitude[2] = ((pd[j] & 0x0f) << 4) + (pd[j + 1] & 0x0f);
break;
case 1:
gps_data.longitude[0] = 0;
gps_data.longitude[1] = 0;
gps_data.longitude[2] = pd[j] & 0x0f;
break;
default:
gps_data.longitude[0] = 0;
gps_data.longitude[1] = 0;
gps_data.longitude[2] = 0;
break;
}
jjj = lookup(pd,len);
switch(jjj - j - jj - 2) // 小数点后的位数
{
case 6:
case 5:
case 4:
gps_data.longitude[3] = ((pd[j + jj + 1] & 0x0f) << 4) + (pd[j + jj + 2] & 0x0f);
gps_data.longitude[4] = ((pd[j + jj + 3] & 0x0f) << 4) + (pd[j + jj + 4] & 0x0f);
break;
case 3:
gps_data.longitude[3] = ((pd[j + jj + 1] & 0x0f) << 4) + (pd[j + jj + 2] & 0x0f);
gps_data.longitude[4] = (pd[j + jj + 3] & 0x0f) << 4;
break;
case 2:
gps_data.longitude[3] = ((pd[j + jj + 1] & 0x0f) << 4) + (pd[j + jj + 2] & 0x0f);
gps_data.longitude[4] = 0;
break;
case 1:
gps_data.longitude[3] = (pd[j + jj + 1] & 0x0f) << 4;
gps_data.longitude[4] = 0;
break;
default:
gps_data.longitude[3] = 0;
gps_data.longitude[4] = 0;
break;
}
}
}
(编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

