Exemple #1
0
bool GPS_NMEA_newFrame(char c) {
    uint8_t frameOK = 0;
    static uint8_t param = 0, offset = 0, parity = 0;
    static char string[15];
    static uint8_t checksum_param, frame = 0;
  
    if (c == '$') {
      param = 0; offset = 0; parity = 0;
    } else if (c == ',' || c == '*') {
      string[offset] = 0;
      if (param == 0) { //frame identification
        frame = 0;
        if (string[0] == 'G' && string[1] == 'N' && string[2] == 'G' && string[3] == 'G' && string[4] == 'A') frame = FRAME_GGA;
        if (string[0] == 'G' && string[1] == 'N' && string[2] == 'R' && string[3] == 'M' && string[4] == 'C') frame = FRAME_RMC;
      } else if (frame == FRAME_GGA) {
        if (param == 2) {
          GPS_Info.GPS_coord[LAT] = GPS_coord_to_degrees(string);
        }
        else if (param == 3 && string[0] == 'S') 
          GPS_Info.GPS_coord[LAT] = -GPS_Info.GPS_coord[LAT];
        else if (param == 4)                     
          {GPS_Info.GPS_coord[LON] = GPS_coord_to_degrees(string);}
        else if (param == 5 && string[0] == 'W') 
          GPS_Info.GPS_coord[LON] = -GPS_Info.GPS_coord[LON];
        else if (param == 6) {
          fgps.GPS_FIX = (string[0]  > '0');
          GPS_Info.GPS_Fixed = fgps.GPS_FIX;
        }
        else if (param == 7) {
          GPS_Info.GPS_numSat = grab_fields(string,0);
        }
        else if (param == 9) {
          GPS_Info.GPS_altitude = grab_fields(string,0);
        }  // altitude in meters added by Mis
      } else if (frame == FRAME_RMC) {
          if (param == 7) {
            GPS_Info.GPS_speed = ((uint32_t)grab_fields(string,1)*5144L)/1000L;}  //gps speed in cm/s will be used for navigation
          else if (param == 8) {
            GPS_Info.GPS_ground_course = grab_fields(string,1);
          }                 //ground course deg*10 
      }
      param++; offset = 0;
      if (c == '*') checksum_param=1;
      else parity ^= c;
    } else if (c == '\r' || c == '\n') {
      if (checksum_param) { //parity checksum
        uint8_t checksum = hex_c(string[0]);
        checksum <<= 4;
        checksum += hex_c(string[1]);
        if (checksum == parity) frameOK = 1;
      }
      checksum_param=0;
    } else {
       if (offset < 15) string[offset++] = c;
       if (!checksum_param) parity ^= c;
    }
    if (frame) GPS_Info.GPS_Present = 1;
    return frameOK && (frame==FRAME_GGA);
}
Exemple #2
0
static bool GPS_NMEA_newFrame(char c)
{
	uint8_t frameOK = 0;
	static uint8_t param = 0, offset = 0, parity = 0;
	static char string[15];
	static uint8_t checksum_param, frame = 0;

	if (c == '$')
	{
		param = 0;
		offset = 0;
		parity = 0;
	}
	else if (c == ',' || c == '*')
	{
		string[offset] = 0;
		if (param == 0)
		{ //frame identification
			frame = 0;
			if (string[0] == 'G' && string[1] == 'P' && string[2] == 'G'
					&& string[3] == 'G' && string[4] == 'A')
				frame = FRAME_GGA;
			if (string[0] == 'G' && string[1] == 'P' && string[2] == 'R'
					&& string[3] == 'M' && string[4] == 'C')
				frame = FRAME_RMC;
		}
		else if (frame == FRAME_GGA)
		{
			if (param == 2)
			{
				gps.coord[LAT] = GPS_coord_to_degrees(string);
			}
			else if (param == 3 && string[0] == 'S')
				gps.coord[LAT] = -gps.coord[LAT];
			else if (param == 4)
			{
				gps.coord[LON] = GPS_coord_to_degrees(string);
			}
			else if (param == 5 && string[0] == 'W')
				gps.coord[LON] = -gps.coord[LON];
			else if (param == 6)
			{
				if (string[0] > '0')
					flagSet(FLAG_GPS_FIX);
				else
					flagClear(FLAG_GPS_FIX);
			}
			else if (param == 7)
			{
				gps.numSat = grab_fields(string, 0);
			}
			else if (param == 9)
			{
				gps.altitude = grab_fields(string, 0); // altitude in meters added by Mis
			}
		}
		else if (frame == FRAME_RMC)
		{
			if (param == 7)
			{
				gps.speed = (grab_fields(string, 1) * 5144L) / 1000L; // speed in cm/s added by Mis
			}
			else if (param == 8)
			{
				gps.ground_course = grab_fields(string, 1); // ground course deg * 10
			}
		}
		param++;
		offset = 0;
		if (c == '*')
			checksum_param = 1;
		else
			parity ^= c;
	}
	else if (c == '\r' || c == '\n')
	{
		if (checksum_param)
		{ // parity checksum
			uint8_t checksum = hex_c(string[0]);
			checksum <<= 4;
			checksum += hex_c(string[1]);
			if (checksum == parity)
				frameOK = 1;
		}
		checksum_param = 0;
	}
	else
	{
		if (offset < 15)
			string[offset++] = c;
		if (!checksum_param)
			parity ^= c;
	}
	return frameOK && (frame == FRAME_GGA);
}
Exemple #3
0
static int gpsNewFrameNMEA(char c)
{
    uint8_t frameOK = 0;
    static uint8_t param = 0, offset = 0, parity = 0;
    static char string[15];
    static uint8_t checksum_param, frame = 0;

    if (c == '$') {
        param = 0;
        offset = 0;
        parity = 0;
    } else if (c == ',' || c == '*') {
        string[offset] = 0;
        if (param == 0) {       // frame identification
            frame = 0;
            if (string[0] == 'G' && string[1] == 'P' && string[2] == 'G' && string[3] == 'G' && string[4] == 'A')
                frame = FRAME_GGA;
            if (string[0] == 'G' && string[1] == 'P' && string[2] == 'R' && string[3] == 'M' && string[4] == 'C')
                frame = FRAME_RMC;
        } else if (frame == FRAME_GGA) {
            if (param == 2) {
                gpsData.lat = GPS_coord_to_degrees(string);
            } else if (param == 3 && string[0] == 'S')
                gpsData.lat = -gpsData.lat;
            else if (param == 4) {
                gpsData.lon = GPS_coord_to_degrees(string);
            } else if (param == 5 && string[0] == 'W')
                gpsData.lon = -gpsData.lon;
            else if (param == 6) {
                gpsData.fix = string[0] > '0';
            } else if (param == 7) {
                gpsData.numSatellites = grab_fields(string, 0);
            } else if (param == 9) {
                gpsData.height = stringToFloat(string);
            }
        } else if (frame == FRAME_RMC) {
            if (param == 7) {
                gpsData.speed = stringToFloat(string) * 51.44444f;      // speed in cm/s
            }
        }
        param++;
        offset = 0;
        if (c == '*')
            checksum_param = 1;
        else
            parity ^= c;
    } else if (c == '\r' || c == '\n') {
        if (checksum_param) {   // parity checksum
            uint8_t checksum = hex_c(string[0]);
            checksum <<= 4;
            checksum += hex_c(string[1]);
            if (checksum == parity)
                frameOK = 1;
        }
        checksum_param = 0;
    } else {
        if (offset < 15)
            string[offset++] = c;
        if (!checksum_param)
            parity ^= c;
    }
    if (frame)
        gpsData.present = 1;
    return frameOK && (frame == FRAME_GGA);
}
Exemple #4
0
static bool GPS_newFrame(char c)
{
    uint8_t frameOK = 0;
    static uint8_t param = 0, offset = 0, parity = 0;
    static char string[15];
    static uint8_t checksum_param, frame = 0;

    if (c == '$') {
        param = 0;
        offset = 0;
        parity = 0;
    } else if (c == ',' || c == '*') {
        string[offset] = 0;
        if (param == 0) {       //frame identification
            frame = 0;
            if (string[0] == 'G' && string[1] == 'P' && string[2] == 'G' && string[3] == 'G' && string[4] == 'A')
                frame = FRAME_GGA;
            if (string[0] == 'G' && string[1] == 'P' && string[2] == 'R' && string[3] == 'M' && string[4] == 'C')
                frame = FRAME_RMC;
        } else if (frame == FRAME_GGA) {
            if (param == 2) {
                GPS_latitude = GPS_coord_to_degrees(string);
            } else if (param == 3 && string[0] == 'S')
                GPS_latitude = -GPS_latitude;
            else if (param == 4) {
                GPS_longitude = GPS_coord_to_degrees(string);
            } else if (param == 5 && string[0] == 'W')
                GPS_longitude = -GPS_longitude;
            else if (param == 6) {
                GPS_fix = string[0] > '0';
            } else if (param == 7) {
                GPS_numSat = grab_fields(string, 0);
            } else if (param == 9) {
                GPS_altitude = grab_fields(string, 0);
            }                   // altitude in meters added by Mis
        } else if (frame == FRAME_RMC) {
            if (param == 7) {
                GPS_speed = ((uint32_t) grab_fields(string, 1) * 514444L) / 100000L;
            }                   // speed in cm/s added by Mis
            if (param == 8) {
                GPS_heading = grab_fields(string, 0);
            }                   // heading
        }
        param++;
        offset = 0;
        if (c == '*')
            checksum_param = 1;
        else
            parity ^= c;
    } else if (c == '\r' || c == '\n') {
        if (checksum_param) {   // parity checksum
            uint8_t checksum = hex_c(string[0]);
            checksum <<= 4;
            checksum += hex_c(string[1]);
            if (checksum == parity)
                frameOK = 1;
        }
        checksum_param = 0;
    } else {
        if (offset < 15)
            string[offset++] = c;
        if (!checksum_param)
            parity ^= c;
    }
    return frameOK && (frame == FRAME_GGA);
}
Exemple #5
0
/***********************
函数功能:GPS接收数据处理,解码字符串
输入参数:串口接收到一字节数据
***********************/
static bool GPS_NewFrame(char c)
{
	u8 frameOK = 0;			//数据更新是否完成
	static u8 param = 0;	//在一帧中的哪一段,0段为引导码
	static u8 offset = 0;	//字符串数组用到
	static u8 parity = 0;	//校验码记录
	static char string[15];	//临时保存每一段需要解析的字符串
	static u8 checksum_param;//校验
	static u8 frame = 0;	//这一桢是哪种格式的,这里用到GPGGA和GPRMC格式
	if(c == '$')	//$符号为一帧数据的起始符号
	{
		param = 0;	//一帧开始,初始化这些变量
		offset = 0;
		parity = 0;
	}
	else if(c == ',' || c == '*')//逗号为一段字符结尾,星号表示结束,后面的是校验码等
	{
		string[offset] = 0;	//让临时字符串最后一位为0结束,这个0是ascii的0呢
		if(param == 0)		//第0段储存着哪种数据格式
		{
			frame = 0;
			if (string[0] == 'G' && string[1] == 'P' && string[2] == 'G' && string[3] == 'G' && string[4] == 'A')
				frame = FRAME_GGA;	//GPGGA数据格式
			if (string[0] == 'G' && string[1] == 'P' && string[2] == 'R' && string[3] == 'M' && string[4] == 'C')
				frame = FRAME_RMC; 	//GPRMC数据格式
		}
		else if(frame == FRAME_GGA)	//进入GPGGA数据格式处理
		{
			if(param == 2)	//纬度
			{
				GPS_coord[LAT] = GPS_Coord_to_Degrees(string);//将纬度转换为ddmm.mmmmm,度分格式
			}
			else if (param == 3 && string[0] == 'S')		//判断是否是南纬
         GPS_coord[LAT] = -GPS_coord[LAT];	//南纬是正,北纬是负
      else if (param == 4) 					//经度
			{
       	GPS_coord[LON] = GPS_Coord_to_Degrees(string);//将经度转换为ddmm.mmmmm,度分格式
      } 
			else if (param == 5 && string[0] == 'W')		//判断是否是西经
        GPS_coord[LON] = -GPS_coord[LON]; //西经用负表示
      else if (param == 6)				//定位质量,0为无效定位,1为有效
			{
        f.GPS_FIX = string[0] > '0';	//string[0] > '0'成立则说明是有效,标记GPS_FIX
      }
			else if (param == 7) 			//使用的卫星数目
			{
	      GPS_numSat = Grab_Fields(string, 0);//将字符转换为数字,卫星数目
	    }
			else if (param == 9) 			//海拔高度
			{
	      GPS_altitude = Grab_Fields(string, 1);  //单位是分米
			}
    }
		else if(frame == FRAME_RMC)	//在这桢获取速度
		{
			if (param == 7) //速度,准确说是速率呵呵,
			{
        GPS_speed = ((uint32_t) Grab_Fields(string, 1) * 5144L) / 1000L;    // 换算单位为CM/S的速度
      }
		}
		param++;		//字符段加1
		offset = 0;		//临时保存字符串清0
		if (c == '*')	//判断是否到校验码了
			checksum_param = 1;//标记到检验码了
		else
			parity ^= c;	//奇偶校验,$和*之间的ascii位或的值,要等于校验码
	}
	else if(c == '\r' || c == '\n')
	{
		if(checksum_param)	//进入校验
		{
			u8 checksum = hex_c(string[0]);
			checksum <<= 4;
			checksum += hex_c(string[1]);
			if (checksum == parity)	//相等,则数据正确无误
				frameOK = 1;
    }
    checksum_param = 0;
	}
	else
	{
		if (offset < 15)
      string[offset++] = c;//保存字符
    if (!checksum_param)
      parity ^= c;
	}
	//if(frame)
	//	GPS_Present = 1;
	return frameOK && (frame == FRAME_GGA);	//数据完全更新成功一次,返回1
}