GPS模块型号: 中科微电子ATGM336H-5N 系列模块
ATGM336H-5N 系列模块是 9.7X10.1 尺寸的高性能 BDS/GNSS 全星座定位导航模块系列的总称。该系列模块产品都是基于中科微第四代低功耗 GNSS SOC 单芯片—AT6558,支持多种卫星导航系统,包括中国的 BDS(北斗卫星导航系统),美国的 GPS,俄罗斯的 GLONASS,欧盟的 GALILEO,日本的 QZSS以及卫星增强系统 SBAS(WAAS,EGNOS,GAGAN,MSAS)。AT6558 是一款真正意义的六合一多模卫星导航定位芯片,包含 32 个跟踪通道,可以同时接收六个卫星导航系统的 GNSS 信号,并且实现联合定位、导航与授时。
ATGM336H-5N 本系列模块具有高灵敏度、低功耗、低成本等优势,适用于车载导航、手持定位、可穿戴设备,可以直接替换 Ublox MAX 系列模块。
GPS模块支持输出标准的NMEA0183 协议。
GPS收到的数据示例:
$GNGGA,114955.000,2842.4158,N,11549.5439,E,1,05,3.8,54.8,M,0.0,M,,*4F
$GNGLL,2842.4158,N,11549.5439,E,114955.000,A,A*4D
$GPGSA,A,3,10,31,18,,,,,,,,,,5.7,3.8,4.2*37
$BDGSA,A,3,07,10,,,,,,,,,,,5.7,3.8,4.2*2A
$GPGSV,3,1,10,10,49,184,42,12,16,039,,14,54,341,,18,22,165,23*7B
$GPGSV,3,2,10,22,11,318,,25,51,055,,26,24,205,,29,13,110,*7C
$GPGSV,3,3,10,31,50,287,36,32,66,018,*7F
$BDGSV,1,1,04,03,,,07,05,,,29,07,79,246,33,10,52,232,19*62
$GNRMC,114955.000,A,2842.4158,N,11549.5439,E,0.00,44.25,061117,,,A*4D
$GNVTG,44.25,T,,M,0.00,N,0.00,K,A*14
$GNZDA,114955.000,06,11,2017,00,00*47
$GPTXT,01,01,01,ANTENNA OK*35
下面介绍GPS每条命令的含义:
序号 命令 说明 最大帧长
1 $GNGGA GPS/北斗定位信息 72
2 $GNGSA 当前卫星信息 65
3 $GPGSV 可见 GPS 卫星信息 210
4 $BDGSV 可见北斗卫星信息 210
5 $GNRMC 推荐定位信息 70
6 $GNVTG 地面速度信息 34
7 $GNGLL 大地坐标信息 --
8 $GNZDA 当前时间(UTC1)信息 --
1, $GNGGA (GPS 定位信息, Global Positioning System Fix Data)
$GNGGA 语句的基本格式如下(其中 M 指单位 M, hh 指校验和, CR 和 LF 代表回车
换行,下同):
$GNGGA,(1),(2),(3),(4),(5),(6),(7),(8),(9),M,(10),M,(11),(12)*hh(CR)(LF)
(1) UTC 时间,格式为 hhmmss.ss;
(2) 纬度,格式为 ddmm.mmmmm(度分格式);
(3) 纬度半球, N 或 S(北纬或南纬);
(4) 经度,格式为 dddmm.mmmmm(度分格式);
(5) 经度半球, E 或 W(东经或西经);
(6) GPS 状态, 0=未定位, 1=非差分定位, 2=差分定位;
(7) 正在使用的用于定位的卫星数量(00~12)
(8) HDOP 水平精确度因子(0.5~99.9)
(9) 海拔高度(-9999.9 到 9999.9 米)
(10) 大地水准面高度(-9999.9 到 9999.9 米)
(11) 差分时间(从最近一次接收到差分信号开始的秒数,非差分定位,此项为空)
(12) 差分参考基站标号(0000 到 1023, 首位 0 也将传送,非差分定位,此项为空)
举例如下:
$GNGGA,095528.000,2318.1133,N,11319.7210,E,1,06,3.7,55.1,M,-5.4,M,,0000*69
2, $GNGSA(当前卫星信息)
$GNGSA 语句的基本格式如下:
$GNGSA,(1),(2),(3),(3),(3),(3),(3),(3),(3),(3),(3),(3),(3),(3),(4),(5),(6)*hh(CR)(LF)
(1) 模式, M = 手动, A = 自动。
(2) 定位类型, 1=未定位, 2=2D 定位, 3=3D 定位。
(3) 正在用于定位的卫星号(01~32)
(4) PDOP 综合位置精度因子(0.5-99.9)ALIENTEK
(5) HDOP 水平精度因子 1(0.5-99.9)
(6) VDOP 垂直精度因子(0.5-99.9)
举例如下:
$GNGSA,A,3,14,22,24,12,,,,,,,,,4.2,3.7,2.1*2D
$GNGSA,A,3,209,214,,,,,,,,,,,4.2,3.7,2.1*21
注 1: 精度因子值越小,则准确度越高。
3, $GPGSV(可见卫星数, GPS Satellites in View)
$GPGSV 语句的基本格式如下:
$GPGSV, (1),(2),(3),(4),(5),(6),(7),...,(4),(5),(6),(7)*hh(CR)(LF)
(1) GSV 语句总数。
(2) 本句 GSV 的编号。
(3) 可见卫星的总数(00~12,前面的 0 也将被传输)。
(4) 卫星编号(01~32,前面的 0 也将被传输)。
(5) 卫星仰角(00~90 度,前面的 0 也将被传输)。
(6) 卫星方位角(000~359 度,前面的 0 也将被传输)
(7) 信噪比(00~99dB,没有跟踪到卫星时为空)。
注:每条 GSV 语句最多包括四颗卫星的信息,其他卫星的信息将在下一条$GPGSV 语句中输出。
举例如下:
$GPGSV,3,1,11,18,73,129,19,10,71,335,40,22,63,323,41,25,49,127,06*78
$GPGSV,3,2,11,14,41,325,46,12,36,072,34,31,32,238,22,21,23,194,08*76
$GPGSV,3,3,11,24,21,039,40,20,08,139,07,15,08,086,03*45
4, $BDGSV(可见卫星数, GPS Satellites in View)
$BDGSV 语句的基本格式如下:
$BDGSV, (1),(2),(3),(4),(5),(6),(7),...,(4),(5),(6),(7)*hh(CR)(LF)
(1) GSV 语句总数。
(2) 本句 GSV 的编号。
(3) 可见卫星的总数(00~12,前面的 0 也将被传输)。
(4) 卫星编号(01~32,前面的 0 也将被传输)。
(5) 卫星仰角(00~90 度,前面的 0 也将被传输)。
(6) 卫星方位角(000~359 度,前面的 0 也将被传输)
(7) 信噪比(00~99dB,没有跟踪到卫星时为空)。
注:每条 GSV 语句最多包括四颗卫星的信息,其他卫星的信息将在下一条$BDGSV 语句中输出。
举例如下:
$BDGSV,1,1,02,209,64,354,40,214,05,318,40*69
5, $GNRMC(推荐定位信息, Recommended Minimum Specific GPS/Transit Data)
$GNRMC 语句的基本格式如下:
$GNRMC,(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)*hh(CR)(LF)
(1) UTC 时间, hhmmss(时分秒)
(2) 定位状态, A=有效定位, V=无效定位
(3) 纬度 ddmm.mmmmm(度分)
(4) 纬度半球 N(北半球)或 S(南半球)ALIENTEK
(5) 经度 dddmm.mmmmm(度分)
(6) 经度半球 E(东经)或 W(西经)
(7) 地面速率(000.0~999.9 节)
(8) 地面航向(000.0~359.9 度,以真北方为参考基准)
(9) UTC 日期, ddmmyy(日月年)
(10) 磁偏角(000.0~180.0 度,前导位数不足则补 0)
(11) 磁偏角方向, E(东)或 W(西)
(12) 模式指示(A=自主定位, D=差分, E=估算, N=数据无效)
举例如下:
$GNRMC,095554.000,A,2318.1327,N,11319.7252,E,000.0,005.7,081215,,,A*73
6, $GNVTG(地面速度信息, Track Made Good and Ground Speed)
$GNVTG 语句的基本格式如下:
$GNVTG,(1),T,(2),M,(3),N,(4),K,(5)*hh(CR)(LF)
(1) 以真北为参考基准的地面航向(000~359 度,前面的 0 也将被传输)
(2) 以磁北为参考基准的地面航向(000~359 度,前面的 0 也将被传输)
(3) 地面速率(000.0~999.9 节,前面的 0 也将被传输)
(4) 地面速率(0000.0~1851.8 公里/小时,前面的 0 也将被传输)
(5) 模式指示(A=自主定位, D=差分, E=估算, N=数据无效)
举例如下:
$GNVTG,005.7,T,,M,000.0,N,000.0,K,A*11
7, $GNGLL(定位地理信息, Geographic Position)
$GNGLL 语句的基本格式如下:
$GNGLL,(1),(2),(3),(4),(5),(6),(7)*hh(CR)(LF)
(1) 纬度 ddmm.mmmmm(度分)
(2) 纬度半球 N(北半球)或 S(南半球)
(3) 经度 dddmm.mmmmm(度分)
(4) 经度半球 E(东经)或 W(西经)
(5) UTC 时间: hhmmss(时分秒)
(6) 定位状态, A=有效定位, V=无效定位
(7) 模式指示(A=自主定位, D=差分, E=估算, N=数据无效)
举例如下:
$GNGLL,2318.1330,N,11319.7250,E,095556.000,A,A*4F
7, $GNZDA(当前时间信息)
$GNZDA 语句的基本格式如下:
$GNZDA,(1),(2),(3),(4), (5), (6)*hh(CR)(LF)
(1) UTC 时间: hhmmss(时分秒)
(2) 日
(3) 月
(4) 年
(5) 本地区域小时(NEO-6M 未用到,为 00)
(6) 本地区域分钟(NEO-6M 未用到,为 00)
举例如下:
$GNZDA,095555.000,08,12,2015,00,00*4C
下面代码里编写了两个重要函数:
第一个函数: 计算GPS指定一条数据的校验和
第二个函数: 提取一条数据指定位置的数据
下面的示例代码是在Qt Creator 里编写的。
#include
#include
#include
extern "C"
{
#include
}
class GPS_Data
{
public:
double lat; //纬度
double lng; //经度
QString GPS_Data;
QString S; //速度
};
class GPS_Data gps_data;
/*
函数功能: 根据逗号位置提取数据
函数参数:
char *gps_src GPS源字符串地址
char *buff 存放提取的数据
char *find_head 查找的GPS数据头 例如:$GNVTG
int cnt 逗号的偏移量
返回值:提取的字节数。
*/
int GPS_GetData(const char *gps_src,const char *find_head,char *buff,int cnt)
{
char *p;
int number=0; //提取的数量
int a=0;
p=strstr(gps_src,find_head);
if(p!=NULL)
{
//查找逗号的位置
while(*p!='\0')
{
if(*p==',')a++; //记录逗号的数量
if(a==cnt)break; //逗号找成功了
p++;
}
p++; //跨过当前逗号
//提取数据
while(*p!='\0')
{
if(*p==',')break; //遇到逗号停止提取数据
buff[number]=*p;
p++;
number++;
}
buff[number]='\0';
}
return number;
}
/*
* 计算GPS数据指定数据的校验和
* char *src_str GPS源字符串
* char *find_str GPS数据头 例如:$GNVTG
* 返回值: -1表示失败 0表示成功
*/
int GPS_GetCheckSum(const char *src_str,const char *find_str)
{
char *tmp_p;
/*1. 开始解析数据*/
tmp_p=strstr(src_str,find_str);
if(tmp_p!=nullptr)
{
unsigned char data=0;
tmp_p++;
//计算校验和
while(*tmp_p!='*' && *tmp_p!='\0')
{
data^=*tmp_p;
tmp_p++;
}
QString sum_str=QString::number(data,16);
QString sum_val;
//提取校验和
sum_val[0]=*(tmp_p+1);
sum_val[1]=*(tmp_p+2);
//判断校验和,不区分大小写
if(sum_str.compare(sum_val,Qt::CaseInsensitive)==0)
{
return 0; //校验正确
}
}
return -1;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
#if 0
//原始数据
QString text="start:f=1;0,end start:f=2;1607,end start:f=3;0,end start:f=1;0,end start:f=2;1640,end start:f=3;0,end start:f=1;0,end start:f=2;1666,end start:f=3;0,end";
int i=0;
//解析数据
while(1) //判断数据是否为真
{
QString data=text.section(QRegExp("\\s"),i,i); //截取s字符开始的数据
qDebug()<
GPS模块上电默认会以1秒的频率将收到的全部数据发送出来,而实际使用GPS的时候,可能只需要经纬度等一些信息,这时候可以通过配置指令设置GPS模块。
中科微电子附带的配置软件支持这些配置。
常用的配置指令如下:(注意: 每个指令后面有\r\n)
设置GPS模块为车载模式: $PCAS11,3*1E
打开全部语句输出: $CCRMO,GGA,4,1*38
关闭全部语句输出: $CCRMO,GGA,3,1*3F
打开RMC语句输出: $CCRMO,RMC,2,1*23
打开VTG语句输出: $CCRMO,VTG,2,1*3A
下面公众号有全套的单片机、QT、C++、C语言、物联网相关的教程,欢迎关注: