EC20 GPS RMC格式数据转化

 


前言

在调试EC20 4G模块的定位功能时,对输出的RMC格式的坐标信息产生了疑惑。带着疑问,在网上查找了资料,总算是解开了心中的疑问。

 

一、RMC是什么?

从百度百科上获知,RMC全称推荐定位信息(GPRMC)。

基本的格式如下:

$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh

<1> UTC时间,hhmmss.sss(时分秒.毫秒)格式

<2> 定位状态,A=有效定位,V=无效定位

<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)

<4> 纬度半球N(北半球)或S(南半球)

<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)

<6> 经度半球E(东经)或W(西经)

<7> 地面速率(000.0~999.9节,前面的0也将被传输)

<8> 地面航向(000.0~359.9度,以正北为参考基准,前面的0也将被传输)

<9> UTC日期,ddmmyy(日月年)格式

<10> 磁偏角(000.0~180.0度,前面的0也将被传输)

<11> 磁偏角方向,E(东)或W(西)

<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

*后hh为$到*所有字符的异或和

二、EC20 输出的RMC解析

1.EC20返回的RMC报文

$GPRMC, 150101.00, A,3438.162431, E,11224. 500999, E, 0.0, 208. 4, 050520,3.9, W, A*22

2.RMC报文解析

由RMC的报文定义所知

1)定位的时间格式为hhmmss.sss(时分秒.毫秒),当前报文的时间为150101.00,即15:01:01。这个时间为UTC时间,和我们的时区北京时间相差了8小时,所以换成北京时间小时要加上8,即北京时间为23:01:01.。

2)定位状态:A,有效。

3)纬度ddmm.mmmm,由格式可以看出,维度的度分模式小数点后面只有4个小数,而返回的报文里面有6位小数,这是怎么一回事呢。其实也是一样的,只不过GPS输出的格式变成了ddmm.mmmmmm,当前报文的数据为3438.162431。

4)纬度半球N。

5)经度dddmm.mmmm,和维度同理,GPS输出的格式dddmm.mmmmmm,当前报文的数据为11224. 500999。

6)经度半球E。

7)地面速率0节。

8)地面航向208. 4°。

9)UTC日期:20年5月5日,转换成北京日期要配合上面的UTC时间进行加减。

10)磁偏角3.9度。

11)磁偏角方向:W(西)。

12) 模式指示A=自主定位。

3.NMEA数据ddmm.mmmm转换成dd.ddddd

实际如果想要在百度地图或Google地图中显示,需要将ddmm.mmmm转换成dd.ddddd经纬度格式

转化公式为:dd.ddddd = dd + mm.mmmm/60。

4.RMC UTC时间转化成北京时间

最后附上UTC转成北京时间C语言代码

typedef struct rdss21Data_t
{
	uint8_t seconds;
	uint8_t minutes;
	uint8_t hours;
	uint8_t day;
	uint8_t month;
	uint8_t year;
}rdss21Data;

void UTCToBeijing(rdss21Data* time)
{
	uint8_t days = 0;
	if (time->month == 1 || time->month == 3 || time->month == 5 || time->month == 7 || time->month == 8 || time->month == 10 || time->month == 12)
	{
		days = 31;
	}
	else if (time->month == 4 || time->month == 6 || time->month == 9 || time->month == 11)
	{
		days = 30;
	}
	else if (time->month == 2)
	{
		if ((time->year % 400 == 0) || ((time->year % 4 == 0) && (time->year % 100 != 0))) /* 判断平年还是闰年 */
		{
			days = 29;
		}
		else
		{
			days = 28;
		}
	}
	time->hours += 8;                 /* 北京时间比格林威治时间快8小时 */
	if (time->hours >= 24)            /* 跨天 */
	{
		time->hours -= 24;
		time->day++;
		if (time->day > days)        /* 跨月 */
		{
			time->day = 1;
			time->month++;
			if (time->month > 12)    /* 跨年 */
			{
				time->year++;
			}
		}
	}
}

总结

RMC格式只要明白具体格式的含义,解析起来并不困难,注意UTC时间转化和经纬度的转化即可。

 

参考资料:

https://blog.csdn.net/qingfengxd1/article/details/105946479

http://blog.sina.com.cn/s/blog_6b2252130102wc0h.html

https://www.cnblogs.com/sekon/p/4609258.html

http://wiki.waaax.top/index.php?title=EC20Demo

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值