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); }
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); }
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); }
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); }
/*********************** 函数功能: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 }