本帖最后由 samplecode 于 2016-8-12 17:06 编辑
[color=rgba(0, 0, 0, 0.6)]使用FRDM-K64F开发板驱动NEO-6M串口GPS模块
串口连的下边PTC15,PTC15
GPS gpsAda(PTC15, PTC14, 9600);
模块靓照

2.GPGGA语句解析GPGGA,GPS固定数据输出语句($GPGGA),这是一帧GPS定位的主要数据,也是使用最广的数据。$GPGGA 语句包括17个字段:语句标识头,世界时间,纬度,纬度半球,经度,经度半球,定位质量指示,使用卫星数量,水平精确度,海拔高度,高度单位,大地水准面高度,高度单位,差分GPS数据期限,差分参考基站标号,校验和结束标记(用回车符和换行符),分别用14个逗号进行分隔。该数据帧的结构及各字段释义如下:
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*xx
$GPGGA:起始引导符及语句格式说明(本句为GPS定位数据); - <1> UTC时间,格式为hhmmss.sss;
- <2> 纬度,格式为ddmm.mmmm(第一位是零也将传送);
- <3> 纬度半球,N或S(北纬或南纬)
- <4> 经度,格式为dddmm.mmmm(第一位零也将传送);
- <5> 经度半球,E或W(东经或西经)
- <6> GPS状态, 0初始化, 1单点定位, 2码差分, 3无效PPS, 4固定解, 5浮点解, 6正在估算 7,人工输入固定值, 8模拟模式, 9WAAS查分
- <7> 使用卫星数量,从00到12(第一个零也将传送)
- <8> 水平精度因子,0.5到99.9
- <9> 天线离海平面的高度,-9999.9到9999.9米
- M 指单位米
- <10> 大地水准面高度,-9999.9到9999.9米
- M 指单位米
- <11> 差分GPS数据期限(RTCM SC-104),最后设立RTCM传送的秒数量,如不是差分定位则为空
- <12> 差分参考基站标号,从0000到1023(首位0也将传送)。
- xx 从$开始到*之间的所有ASCII码的异或校验和
- 回车
- 换行
3.GPS库部分代码
主程序;main.cpp
- /* Example showing how to hook up to different GPS modules (GlobalSat neo-6m)*/
- #include "mbed.h"
- #include "GPS.h"
- //create usb serial
- Serial pc(USBTX, USBRX);
- //creat gps serial baud is 9600
- GPS gpsAda(PTC15, PTC14, 9600);
- int main()
- {
- while (1) {
- if(gpsAda.sample()){
- pc.printf("%f\t%c\t%f\t%c\t%f\t%f\t%f\n\r",gpsAda.longitude, gpsAda.ns,gpsAda.latitude,gpsAda.ew, gpsAda.alt, gpsAda.geoid, gpsAda.time);
- //print beijing time
- pc.printf("%d:%d:%d",gpsAda.hour,gpsAda.minute,gpsAda.seconed);
- }
- }
- }
复制代码
GPS库的sample()方法
- int GPS::sample()
- {
- int lock;
- while(1) {
- //调用函数读取一行数据
- getline();
- //用sscanf()检查是不是GPGGA数据
- // Check if it is a GPGGA msg (matches both locked and non-locked msg)
- if(sscanf(msg, "GPGGA,%f,%f,%c,%f,%c,%d,%d,%f,%f,%c,%f", &time, &latitude, &ns, &longitude, &ew, &lock, &sats, &hdop, &alt, &unit, &geoid) >= 1) {
- //看看有没有找到卫星
- if(!lock) {
- time = 0.0;
- longitude = 0.0;
- latitude = 0.0;
- sats = 0;
- hdop = 0.0;
- alt = 0.0;
- geoid = 0.0;
- return 0;
- } else {
- //GPGGA format according http://aprs.gids.nl/nmea/#gga
- // time (float), lat (f), (N/S) (c), long (f), (E/W) (c), fix (d), sats (d),
- // hdop (float), altitude (float), M, geoid (float), M, , ,
- //GPGGA,092010.000,5210.9546,N,00008.8913,E,1,07,1.3,9.7,M,47.0,M,,0000*5D
- //转换为北京时间,原来的是UTC时间,utc+8就是北京时间,%取余运算
- //format utc time to beijing time,add 8 time zone
- time = time + 80000.00f;
- hour = int(time) / 10000;
- minute = (int(time) % 10000) / 100;
- seconed = int(time) % 100;
-
- return 1;
- }
- }
- }
- }
复制代码
串口输出结果 1
2
3
4
5
6
7
8
9
10
11
12
| 15311.202148 N 3235.849365 E 52.099998 -9.000000 162005.000000
16:20:5
15311.202148 N 3235.849121 E 51.500000 -9.000000 162006.000000
16:20:6
15311.202148 N 3235.849121 E 50.299999 -9.000000 162007.000000
16:20:7
15311.202148 N 3235.848877 E 49.200001 -9.000000 162008.000000
16:20:8
15311.202148 N 3235.848633 E 48.599998 -9.000000 162009.000000
16:20:9
15311.203125 N 3235.848633 E 47.900002 -9.000000 162010.000000
16:20:10 |
|