GPS数据帧解算算法

一种解算各个格式的GPS数据帧的算法,从数据中解算出经纬度等关键数据,仿照该原理可以解析其他类型数据帧,测试能成功运行


GPS_Data GPSdata;
// char Serial_RxPacket1[100] = "$GPGGA,123519,4807.038,N,11131.000,E,1,08,0.9,545.4,M,46.9,M,,*47";
// char Serial_RxPacket[] = "$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68";
// char Serial_RxPacket1[] = "$GPGLL,4916.45,N,12311.12,W,225444,A*31";
// GPS����֡����

extern char Serial_RxPacket[100];

GPS_Data parse_GPGGA(char *gps_string) {
	char *token = strtok(gps_string, ",");//分解字符串为一组字符串
	int field_num = 0;
	
	//经纬度计算用
	float coordinate = 0;
	int degree = 0;
	float minute = 0;

	uint8_t handleflag;
	handleflag = 0;

	while (token != NULL) {
		if(field_num == 1) {
			handleflag = 1;
			strncpy(GPSdata.time, token, 10);//把 src 所指向的字符串复制到 dest,最多复制 n 个字符
		}
		if(field_num == 2){						//纬度转换
			coordinate = atof(token);
			degree = coordinate / 100;	// 取整数部分作为度数
			float minute = coordinate - degree * 100;	// 取小数部分作为分钟数
			GPSdata.latitude = degree + minute / 60;	// 将分钟数转换为度数
			printf("纬度转换成功\n");
		}
		if(field_num == 3){
				if (strcmp(token, "S") == 0) {			//南北纬设定,南纬为-
					GPSdata.latitude *= -1;
				}
		}
		if(field_num == 4){

					float coordinate = atof(token);
					int degree = coordinate / 100;	// 取整数部分作为度数
					float minute = coordinate - degree * 100;	// 取小数部分作为分钟数
					GPSdata.longitude = degree + minute / 60;	// 将分钟数转换为度数
					printf("经度转换成功\n");
		}
		if(field_num == 5){
				if (strcmp(token, "W") == 0) {
					GPSdata.longitude *= -1;
				}
		}
		if(field_num == 6){
			GPSdata.fix_quality = atoi(token);
		}
		if(field_num == 7){
				GPSdata.num_satellites = atoi(token);
		}
		if(field_num == 8){
				GPSdata.hdop = atof(token);
		}
		if(field_num == 9){
				GPSdata.altitude = atof(token);
		}
		token = strtok(NULL, ",");
		field_num++;
		if(field_num >= 10) break;
	}
	printf("数据处理完成\n");
	return GPSdata;
}

GPS_Data parse_GPRMC(char *gps_string) {
	char *token = strtok(gps_string, ",");//分解字符串为一组字符串
	int field_num = 0;
	while (token != NULL) {
		if(field_num == 1) {
			strncpy(GPSdata.time, token, 10);//把 src 所指向的字符串复制到 dest,最多复制 n 个字符
		}
		if(field_num == 3) {							//纬度转换
			float coordinate = atof(token);
			int degree = coordinate / 100;	// 取整数部分作为度数
			float minute = coordinate - degree * 100;	// 取小数部分作为分钟数
			GPSdata.latitude = degree + minute / 60;	// 将分钟数转换为度数
			printf("纬度转换成功\n");
		}
		if(field_num == 4) {
			if (strcmp(token, "S") == 0) {			//南北纬设定,南纬为-
				GPSdata.latitude *= -1;
			}
		}
		if(field_num == 5) {
			float coordinate = atof(token);
			int degree = coordinate / 100;	// 取整数部分作为度数
			float minute = coordinate - degree * 100;	// 取小数部分作为分钟数
			GPSdata.longitude = degree + minute / 60;	// 将分钟数转换为度数
			printf("经度转换成功\n");
		}
		if(field_num == 6) {
			if (strcmp(token, "W") == 0) {
				GPSdata.longitude *= -1;
			}
		}
		// if(field_num == 7) {
		// 	GPSdata.speed = atoi(token);
		// }
		// if(field_num == 8) {
		// 	//GPSdata.num_satellites = atoi(token);
		// 	}
		// if(field_num == 9) {
		// 	//GPSdata.hdop = atof(token);
		// 	}
		// if(field_num == 10) {
		// 	//GPSdata.altitude = atof(token);
		// }
		token = strtok(NULL, ",");
		field_num++;
		if(field_num >= 10) break;
	}
	printf("数据处理完成\n");
	return GPSdata;
}

GPS_Data parse_GPGLL(char *gps_string){
	char *token = strtok(gps_string, ",");//分解字符串为一组字符串
	int field_num = 0;

	//经纬度计算用
	float coordinate = 0;
	int degree = 0;
	float minute = 0;

	uint8_t handleflag;
	handleflag = 0;

	while (token != NULL) {
		if(field_num == 1){
			coordinate = atof(token);
			degree = coordinate / 100;	// 取整数部分作为度数
			minute = coordinate - degree * 100;	// 取小数部分作为分钟数
			GPSdata.latitude = degree + minute / 60;	// 将分钟数转换为度数
			printf("纬度转换成功\n");
		}
		else if(field_num == 2){
			if (strcmp(token, "S") == 0) {			//南北纬设定,南纬为-
				GPSdata.latitude *= -1;
			}
		}
		else if(field_num == 3){
			coordinate = atof(token);
			degree = coordinate / 100;	// 取整数部分作为度数
			minute = coordinate - degree * 100;	// 取小数部分作为分钟数
			GPSdata.longitude = degree + minute / 60;	// 将分钟数转换为度数
			printf("经度转换成功\n");
		}
		else if(field_num == 4){
			if (strcmp(token, "W") == 0) {
				GPSdata.longitude *= -1;
			}
		}
		token = strtok(NULL, ",");
		field_num++;
		if(field_num >= 10) break;
	}
	printf("数据处理完成\n");
	return GPSdata;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值