📄 gps_nmea_rmc_interpreter.c
字号:
current_state = GPS_NMEA_RMC_SPEED_SEG;
seg_offset = *prx_counter + 1;
}
else
*prx_counter = 0;
break;
}
break;
//*********************************************************************************************************
//************************************** seg spd.value ***********************************************
//*********************************************************************************************************
case GPS_NMEA_RMC_SPEED_SEG : switch(cnt)
{
case 0 : gpsdata_buf.spd.value = (rx-'0')*1852/10;
break;
case 1 :
case 2 :
case 3 :
case 4 : if(rx != '.')
{
gpsdata_buf.spd.value *= 10;
gpsdata_buf.spd.value += (rx-'0')*1852/10;
}
else if(rx == ',')
{
current_state = GPS_NMEA_RMC_SPEED_DIR_SEG;
seg_offset = *prx_counter + 1;
}
break;
default : if(rx == ',')
{
current_state = GPS_NMEA_RMC_SPEED_DIR_SEG;
seg_offset = *prx_counter + 1;
}
else
*prx_counter = 0;
break;
}
break;
//************************************** seg spd.dir ***********************************************
case GPS_NMEA_RMC_SPEED_DIR_SEG : switch(cnt)
{
case 0 : gpsdata_buf.spd.dir = (rx-'0');
break;
case 1 :
case 2 :
case 3 :
case 4 : if(rx != '.')
{
gpsdata_buf.spd.dir *= 10;
gpsdata_buf.spd.dir += (rx-'0');
}
else if(rx == ',')
{
current_state = GPS_NMEA_RMC_DATE_SEG;
seg_offset = *prx_counter + 1;
}
break;
default : if(rx == ',')
{
current_state = GPS_NMEA_RMC_DATE_SEG;
seg_offset = *prx_counter + 1;
}
else
*prx_counter = 0;
break;
}
break;
//*********************************************************************************************************
//************************************** seg date.date ***********************************************
//*********************************************************************************************************
case GPS_NMEA_RMC_DATE_SEG : switch(cnt)
{
case 0 : gpsdata_buf.date.date = (rx-'0')*10;
break;
case 1 : gpsdata_buf.date.date += (rx-'0');
break;
//************************************** seg date.month **********************************************
case 2 : gpsdata_buf.date.month = (rx-'0')*10;
break;
case 3 : gpsdata_buf.date.month += (rx-'0');
break;
//************************************** seg date.year **********************************************
case 4 : gpsdata_buf.date.year = (rx-'0')*10;
break;
case 5 : gpsdata_buf.date.year += (rx-'0');
break;
//****************************************** , ******************************************************
default : if(rx == ',')
{
current_state = GPS_NMEA_RMC_MAG_SEG;
seg_offset = *prx_counter + 1;
}
else
*prx_counter = 0;
break;
}
break;
//*********************************************************************************************************
//************************************** seg mag.value ***********************************************
//*********************************************************************************************************
case GPS_NMEA_RMC_MAG_SEG : switch(cnt)
{
case 0 : gpsdata_buf.mag.value = (rx-'0')*1852/10;
break;
case 1 :
case 2 :
case 3 :
case 4 : if(rx != '.')
{
gpsdata_buf.mag.value *= 10;
gpsdata_buf.mag.value += (rx-'0')*1852/10;
}
else if(rx == ',')
{
current_state = GPS_NMEA_RMC_MAG_DIR_SEG;
seg_offset = *prx_counter + 1;
}
break;
default : if(rx == ',')
{
current_state = GPS_NMEA_RMC_MAG_DIR_SEG;
seg_offset = *prx_counter + 1;
}
else
*prx_counter = 0;
break;
}
break;
//************************************** seg mag.dir ***********************************************
case GPS_NMEA_RMC_MAG_DIR_SEG : switch(cnt)
{
case 0 : gpsdata_buf.mag.dir = rx;
break;
//****************************************** , ****************************************************
default : if(rx == ',')
{
current_state = GPS_NMEA_RMC_MODE_SEG;
seg_offset = *prx_counter + 1;
}
else
*prx_counter = 0;
break;
}
break;
//*********************************************************************************************************
//****************************************** seg mode ***********************************************
//*********************************************************************************************************
case GPS_NMEA_RMC_MODE_SEG : switch(cnt)
{
case 0 : gpsdata_buf.mag.dir = rx;
break;
default : if(rx == '*')
{
current_state = GPS_NMEA_RMC_CHECKSUM_SEG;
seg_offset = *prx_counter + 1;
}
else
*prx_counter = 0;
break;
}
break;
//*********************************************************************************************************
//****************************************** seg checksum *******************************************
//*********************************************************************************************************
case GPS_NMEA_RMC_CHECKSUM_SEG : switch(cnt)
{
case 0 : if((rx>='a')&&(rx<='f'))
gpsdata_buf.checksum = (0x0a + (rx - 'a'))<<4 ;
else if((rx>='A')&&(rx<='F'))
gpsdata_buf.checksum = (0x0a + (rx - 'A'))<<4 ;
else if((rx>='0')&&(rx<='9'))
gpsdata_buf.checksum = (rx - '0')<<4 ;
else
*prx_counter = 0;
break;
case 1 : if((rx>='a')&&(rx<='f'))
gpsdata_buf.checksum += 0x0a + (rx - 'a') ;
else if((rx>='A')&&(rx<='F'))
gpsdata_buf.checksum += 0x0a + (rx - 'A') ;
else if((rx>='0')&&(rx<='9'))
gpsdata_buf.checksum += rx - '0' ;
else
*prx_counter = 0;
break;
default : if(rx == ',')
{
current_state = GPS_NMEA_RMC_END_SEG;
seg_offset = *prx_counter + 1;
}
else
*prx_counter = 0;
break;
}
break;
}
if(current_state != GPS_NMEA_RMC_CHECKSUM_SEG)
checksum ^= rx;
else if(current_state == GPS_NMEA_RMC_END_SEG)
{
if(checksum == gpsdata_buf.checksum);
// memcpy()
seg_offset = 0;
checksum = 0;
current_state = GPS_MOTO_TYPE_SEG;
}
}
/*********************************************************************************************************
End Of File
**********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -