📄 gps_nmea_rmc_interpreter.c
字号:
/*********************************************************************************************************
** uC/OS 2 FOR PHILIP LPC21XX
** The Real-Time Kernel(For ADS1.2)
**
**
** V0.00.1
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: Drv_GPS.C
**创 建 人: 龚树强
**最后修改日期: 2005年5月2日
**描 述: 串口0驱动程序
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 龚树强
** 版 本: V0.01.1
** 日 期: 2005年5月2日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "..\source\Includes.h"
#include "..\driver\Drv_GPS\GPS_NMEA_RMC_Interpreter.h"
/*******************************************************************************
********************* 常 量 定 义 ************************
********************************************************************************/
/*******************************************************************************
********************* 变 量 定 义 ************************
********************************************************************************/
extern INT8U current_state,seg_offset,checksum;
extern GPS_DATA gpsdata_buf;
/*********************************************************************************************************
** 函数名称: GPS_NMEA_RMC_Interpreter
** 功能描述: GPS NMEA格式RMC包解释函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年1月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GPS_NMEA_RMC_Interpreter(INT8U rx,INT8U *prx_counter) reentrant
{
INT8U cnt;
cnt = *prx_counter - seg_offset;
switch(current_state)
{
case GPS_NMEA_TYPE_SEG : current_state = GPS_NMEA_RMC_TIME_SEG;
seg_offset = *prx_counter;
cnt = *prx_counter - seg_offset;
//*********************************************************************************************************
//*********************************** seg time.hour ************************************************
//*********************************************************************************************************
case GPS_NMEA_RMC_TIME_SEG : switch(cnt)
{
case 0 : gpsdata_buf.time.hour = (rx-'0')*10;
break;
case 1 : gpsdata_buf.time.hour += (rx-'0');
break;
//*********************************** seg time.min ************************************************
case 2 : gpsdata_buf.time.min = (rx-'0')*10;
break;
case 3 : gpsdata_buf.time.min += (rx-'0');
break;
//*********************************** seg time.sec ************************************************
case 4 : gpsdata_buf.time.sec = (rx-'0')*10;
break;
case 5 : gpsdata_buf.time.sec += (rx-'0');
break;
//****************************************** . ****************************************************
case 6 : if(rx!='.')
*prx_counter = 0;
break;
//*********************************** seg time.msec ************************************************
case 7 : gpsdata_buf.time.msec = (rx-'0')*1000;
break;
case 8 : gpsdata_buf.time.msec += (rx-'0')*100;
break;
case 9 : gpsdata_buf.time.msec += (rx-'0')*10;
break;
case 10 : gpsdata_buf.time.msec += (rx-'0');
break;
//****************************************** , ****************************************************
default : if(rx == ',')
{
current_state = GPS_NMEA_RMC_STATE_SEG;
seg_offset = *prx_counter + 1;
}
else
*prx_counter = 0;
break;
}
break;
//*********************************************************************************************************
//*********************************** seg active satae **********************************************
//*********************************************************************************************************
case GPS_NMEA_RMC_STATE_SEG : switch(cnt)
{
case 0 : gpsdata_buf.state = rx;
break;
//****************************************** , ****************************************************
default : if(rx == ',')
{
current_state = GPS_NMEA_RMC_LATITUDE_SEG;
seg_offset = *prx_counter + 1;
}
else
*prx_counter = 0;
break;
}
break;
//*********************************************************************************************************
//********************************** seg latitude.dec ***********************************************
//*********************************************************************************************************
case GPS_NMEA_RMC_LATITUDE_SEG : switch(cnt)
{
case 0 : gpsdata_buf.latitude.dec = (rx-'0')*10;
break;
case 1 : gpsdata_buf.latitude.dec += (rx-'0');
break;
//******************************* seg latitude.min ************************************************
case 2 : gpsdata_buf.latitude.min = (rx-'0')*10;
break;
case 3 : gpsdata_buf.latitude.min += (rx-'0');
break;
//****************************************** . ****************************************************
case 4 : if(rx!='.')
*prx_counter = 0;
break;
//******************************* seg latitude.msec ************************************************
case 5 : gpsdata_buf.latitude.mmin = (rx-'0')*1000;
break;
case 6 : gpsdata_buf.latitude.mmin += (rx-'0')*100;
break;
case 7 : gpsdata_buf.latitude.mmin += (rx-'0')*10;
break;
case 8 : gpsdata_buf.latitude.mmin += (rx-'0');
break;
//****************************************** , ****************************************************
case 9 : if(rx!=',')
*prx_counter = 0;
break;
//******************************* seg latitude.dir ************************************************
case 10 : gpsdata_buf.latitude.dir = rx;
break;
//****************************************** , ****************************************************
default : if(rx == ',')
{
current_state = GPS_NMEA_RMC_LONGTITUDE_SEG;
seg_offset = *prx_counter + 1;
}
else
*prx_counter = 0;
break;
}
break;
//*********************************************************************************************************
//********************************** seg longitude.dec ***********************************************
//*********************************************************************************************************
case GPS_NMEA_RMC_LONGTITUDE_SEG : switch(cnt)
{
case 0 : gpsdata_buf.longitude.dec = (rx-'0')*100;
break;
case 1 : gpsdata_buf.longitude.dec += (rx-'0')*10;
break;
case 2 : gpsdata_buf.longitude.dec += (rx-'0');
break;
//******************************* seg longitude.min ************************************************
case 3 : gpsdata_buf.longitude.min = (rx-'0')*10;
break;
case 4 : gpsdata_buf.longitude.min += (rx-'0');
break;
//****************************************** . ****************************************************
case 5 : if(rx!='.')
*prx_counter = 0;
break;
//******************************* seg longitude.msec ************************************************
case 6 : gpsdata_buf.longitude.mmin = (rx-'0')*1000;
break;
case 7 : gpsdata_buf.longitude.mmin += (rx-'0')*100;
break;
case 8 : gpsdata_buf.longitude.mmin += (rx-'0')*10;
break;
case 9 : gpsdata_buf.longitude.mmin += (rx-'0');
break;
//****************************************** , ****************************************************
case 10 : if(rx!=',')
*prx_counter = 0;
break;
//******************************* seg longitude.dir ************************************************
case 11 : gpsdata_buf.longitude.dir = rx;
break;
//****************************************** , ****************************************************
default : if(rx == ',')
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -