最近因为一个小课题开始研究GPS模块数据的处理,要想拿到最后实际可用的GPS数据信息,从数据读取、数据解析以及数据转换都需要进行相应的研究。
在本文中将简要如何通过STM32读取GPS模块原始数据,并对数据进行解析处理得到可视的GPS数据、最终通过坐标系转换得到在地图上可用的GPS信息。
GPS模块介绍
GPS接收器
颜色 | 功能 |
---|---|
红色 | VCC |
黑色 | GND |
绿色 | TxD |
黄色 | RxD |
GPS数据介绍
GPS上电后,每隔一定的时间就会返回一定格式的数据,该数据遵循NMEA0183标准,
该协议采用ASCII码,其串行通信默认参数为:波特率=9600bps,数据位=8bit,开始位=1bit,停止位=1bit,无奇偶校验。
GPS数据格式为:
1 | $aaccc,ddd,ddd,...,ddd*hh<CR><LF> |
1 | $: 帧命令起始位 |
以下是示例数据:
1 | $GPRMC,092927.000,A,2235.9058,N,11400.0518,E,0.000,74.11,151216,,D*49 |
GPGGA GPS定位数据
Global Positioning System Fix Data
1 | $GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh |
1 | <1> UTC时间,格式为hhmmss.sss(时分秒) |
GPRMC 最小定位信息
Recommended Minimum Specific GPS/TRANSIT Data
1 | $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh |
1 | <1> UTC时间,格式为hhmmss.sss(时分秒) |
其他信息
- GPVTG 地面速度信息
- GPGSV 可视卫星状态
- GPGSA 当前卫星信息
GPS数据读取
配置串口
STM32CubeMX自动生成配置代码
1 | UART_HandleTypeDef huart2; |
1 | void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) |
1 | void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) |
GPS数据解析
1 | //获取当前数据中指定逗号后面的字符在该数据中的位置,用于定位具体数据块的位置 |
1 | typedef data struct |
GPS数据转换
地图坐标
由于与GPS相关的坐标系有若干种,在开发与地点相关的应用时,如果对坐标系不加处理,很容易出现几种形式的地图之间出现坐标点偏移的情况。因此在坐标系之间进行转换非常重要。
- WGS-84:世界大地测量系统,国际通用标准
- GPS模块、国际版Google Map使用
- GCJ-02:中国坐标偏移标准,俗称火星坐标系
- 遵循国内测绘法,基于WGS-84系统加入随机漂移
- 国内版谷歌地图、高德地图、腾讯地图使用
- BD-09:百度坐标偏移标准
- 基于GCJ-02多增加一次变换
- 百度地图使用
C语言代码
基于网上开源内容整理了C语言实现GPS坐标转换的代码。
1 |
|
可以使用这个在线工具进行测试:C 在线工具 | 菜鸟工具
参考文献
GPS坐标互转:WGS-84(GPS)、GCJ-02(Google地图)、BD-09(百度地图) | JS,PHP
gps各种地图坐标系转换 | Java