文章目录
一、协议说明
"GN-" 联合模式协议头;
"GP-"GPS模式协议头;
"GL-"GLONASS模式协议头;
"GB-/BD-"北斗模式协议头;
示例:
$GNRMC,073114.00,A,2237.56240,N,11401.59614,E,1.329,21.11,020916,,,A,V*37
名称 | 示例 | 单位 | 描述 |
讯息代号 | $GNRMC | RMC 规范抬头 | |
标准定位时间 | 073114.00 | 时时分分秒秒.秒秒秒 | |
定位状态 | A | A:已定位有效,V:未定位无效 | |
纬度 | 2237.56240 | 度度分分.分分分分 | |
北半球或南半球指示器 | N | 北半球(N)或南半球(S) | |
经度 | 11401.59614 | 度度度分分.分分分分 | |
东半球或西半球指示器 | E | 东(E)半球或西(W)半球 | |
对地速度 | 1.329 | 节 | 对地速度 |
对地方向 | 21.11 | 度 | 对地方向 |
日期 | 020916 | 日日月月年年 | |
- | - | - | |
- | - | - | |
- | A | - | |
- | V | - | |
总和检查码 | *37 | ||
<CR> <LF> | 讯息终点 |
$GNVTG,21.11,T,,M,1.329,N,2.462,K,A*1B
名称 | 示例 | 单位 | 描述 |
讯息代号 | $GNVTG | VTG 规范抬头 | |
对地方向 | 21.11 | 度 | 对地方向 |
- | T | - | |
磁极对地方向 | - | ||
- | M | - | |
对地速度 | 1.329 | 节 | 对地速度 |
单位 | N | 节 | |
对地速度 | 2.462 | 公里/小时 | 公里/小时 |
单位 | K | 公里/小时 | 公里/小时 |
- | A | - | |
总和检查码 | *1B | ||
<CR> <LF> | 讯息终点 |
$GNGGA,073114.00,2237.56240,N,11401.59614,E,1,12,0.78,112.9,M,-2.5,M,,*54
名称 | 示例 | 单位 | 描述 |
讯息代号 | $GNGGA | GGA 规范抬头 | |
标准定位时间 | 73114 | 时时分分秒秒.秒秒秒 | |
纬度 | 2237.5624 | 度度分分.分分分分 | |
北半球或南半球指示器 | N | 北半球(N)或南半球(S) | |
经度 | 11401.59614 | 度度度分分.分分分分 | |
东半球或西半球指示器 | E | 东(E)半球或西(W)半球 | |
定位代号指示器 | 1 | 0:未定位或无效的定位 1:已定位 标准 GPS(2D/3D) 2:已定位 差分 GPS 6:已定位 惯导 GPS | |
使用中的卫星数目 | 12 | ||
水平稀释精度 | 0.78 | ||
海拔高度 | 112.9 | 米 | |
单位 | M | 米 | |
地表平均高度 | -2.5 | 米 | |
单位 | M | 米 | |
- | - | - | |
总和检查码 | *54 | ||
<CR> <LF> | 讯息终点 |
$GNGSA,A,3,19,05,02,06,17,12,09,13,,,,,1.48,0.78,1.26,1*01
名称 | 示例 | 单位 | 描述 |
讯息代号 | $GNGSA | GSA 规范抬头 | |
模式 1 | A | 手动—强迫于二维定位或三维定位模式运作 自动—允许自动切换二维定位 | |
模式 2 | 3 | 1:未定位;2:2D 定位;3:3D 定位 | |
卫星使用 | 19 | 信号频道 1 | |
卫星使用 | 5 | 信号频道 2 | |
…… | … | … | |
卫星使用 | 信号频道 12 | ||
位置精度稀释值 PDOP | 1.48 | ||
水平精度稀释值 HDOP | 0.78 | ||
垂直精度稀释值 VDOP | 1.26 | ||
- | 1 | - | |
总和检查码 | *01 | ||
<CR> <LF> | 讯息终点 |
$GPGSV,4,1,13,02,46,340,36,05,52,254,37,06,42,041,41,09,22,053,40,0*6E
名称 | 实例 | 单位 | 描述 |
讯息代号 | $GPGSV | GSV 规范抬头 | |
讯息总数 | 4 | ||
讯息号码 | 1 | ||
天空中卫星总数 | 13 | ||
卫星编号 | 2 | ||
卫星仰角 | 46 | ||
卫星方位角 | 340 | ||
讯号噪声比(C/No) | 36 | ||
…… | … | … | |
卫星编号 | 9 | ||
卫星仰角 | 22 | ||
卫星方位角 | 53 | ||
讯号噪声比(C/No) | 40 | ||
- | 0 | - | |
总和检查码 | *6E | ||
<CR> <LF> | 讯息终点 |
$GNGLL,2237.56240,N,11401.59614,E,073114.00,A,A*7C
名称 | 实例 | 单位 | 描述 |
讯息代号 | $GNGLL | GLL 规范抬头 | |
纬度 | 2237.5624 | 度度分分.分分分分 | |
北半球或南半球指示器 | N | 北半球(N)或南半球(S) | |
经度 | 11401.59614 | 度度度分分.分分分分 | |
东半球或西半球指示器 | E | 东(E)半球或西(W)半球 | |
标准定位时间 | 73114 | 时时分分秒秒 | |
状态 | A | A:已定位有效,V:未定位无效 | |
- | A | - | |
总和检查码 | *7C | ||
<CR> <LF> | 讯息终点 |
二、具体实现
1. $GNRMC
void CGPSPositionWidget::GPSParse(QByteArray GPSBuffer)
{
double gpslat = 0.0;
double gpsLon = 0.0;
double gpsElevation = 0.0;
if (GPSBuffer.contains("$GNRMC"))
{
QList<QByteArray> gpsByteArrays = GPSBuffer.split(',');
if (ConvertCharArrayToQString(gpsByteArrays.at(2)) == ConvertCharArrayToQString("A"))
{
ui->statusLabel->setText(ConvertCharArrayToQString("已定位 标准定位"));
int gpsLat_1 = static_cast<int>(gpsByteArrays.at(3).toDouble()/100);
double gpsLat_2 = (gpsByteArrays.at(3).toDouble() - gpsLat_1 * 100)/60;
if (ConvertCharArrayToQString(gpsByteArrays.at(4)) == ConvertCharArrayToQString("N"))
{
gpslat=gpsLat_1 + gpsLat_2;
}
if (ConvertCharArrayToQString(gpsByteArrays.at(4)) == ConvertCharArrayToQString("S"))
{
gpslat= -1 * (gpsLat_1 + gpsLat_2);
}
int gpsLon_1 = static_cast<int>(gpsByteArrays.at(5).toDouble()/100);
double gpsLon_2 = (gpsByteArrays.at(5).toDouble()-gpsLon_1 * 100)/60;
if (ConvertCharArrayToQString(gpsByteArrays.at(6)) == ConvertCharArrayToQString("E"))
{
gpsLon = gpsLon_1 + gpsLon_2;
}
if (ConvertCharArrayToQString(gpsByteArrays.at(6)) == ConvertCharArrayToQString("W"))
{
gpsLon = -1 * (gpsLon_1 + gpsLon_2);
}
ui->timelineEdit->setText(ConvertCharArrayToQString(gpsByteArrays.at(1)));
ui->latlineEdit->setText(QString::number(gpslat,'g',9));
ui->lonlineEdit->setText(QString::number(gpsLon,'g',9));
gpsElevation = 0.0;
ui->elevationlineEdit->setText(ConvertCharArrayToQString("NULL"));
}
else
{
ui->statusLabel->setText(ConvertCharArrayToQString("信号丢失!"));
return;
}
}
}
2. $GNGGA
void CGPSPositionWidget::GPSParse(QByteArray GPSBuffer)
{
double gpslat=0.0;
double gpsLon=0.0;
double gpsElevation=0.0;
if (GPSBuffer.contains("$GNGGA"))
{
QList<QByteArray> gpsByteArrays = GPSBuffer.split(',');
if (ConvertCharArrayToQString(gpsByteArrays.at(6)) != ConvertCharArrayToQString("0"))
{
if (ConvertCharArrayToQString(gpsByteArrays.at(6)) == ConvertCharArrayToQString("1"))
{
ui->statusLabel->setText(ConvertCharArrayToQString("已定位 标准GPS"));
}
else if (ConvertCharArrayToQString(gpsByteArrays.at(6)) == ConvertCharArrayToQString("2"))
{
ui->statusLabel->setText(ConvertCharArrayToQString("已定位 差分GPS"));
}
else
{
ui->statusLabel->setText(ConvertCharArrayToQString("已定位 惯导GPS"));
}
int gpsLat_1 = static_cast<int>(gpsByteArrays.at(2).toDouble()/100);
double gpsLat_2 = (gpsByteArrays.at(2).toDouble() - gpsLat_1 * 100)/60;
if (ConvertCharArrayToQString(gpsByteArrays.at(3)) == ConvertCharArrayToQString("N"))
{
gpslat=gpsLat_1 + gpsLat_2;
}
if (ConvertCharArrayToQString(gpsByteArrays.at(3)) == ConvertCharArrayToQString("S"))
{
gpslat= -1 * (gpsLat_1 + gpsLat_2);
}
int gpsLon_1 = static_cast<int>(gpsByteArrays.at(4).toDouble()/100);
double gpsLon_2 = (gpsByteArrays.at(4).toDouble()-gpsLon_1 * 100)/60;
if (ConvertCharArrayToQString(gpsByteArrays.at(5)) == ConvertCharArrayToQString("E"))
{
gpsLon = gpsLon_1 + gpsLon_2;
}
if (ConvertCharArrayToQString(gpsByteArrays.at(5)) == ConvertCharArrayToQString("W"))
{
gpsLon = -1 * (gpsLon_1 + gpsLon_2);
}
ui->timelineEdit->setText(ConvertCharArrayToQString(gpsByteArrays.at(1)));
ui->latlineEdit->setText(QString::number(gpslat,'g',9));
ui->lonlineEdit->setText(QString::number(gpsLon,'g',9));
gpsElevation = gpsByteArrays.at(9).toDouble();
if(!gpsByteArrays.at(9).isEmpty())
{
ui->elevationlineEdit->setText(gpsByteArrays.at(9));
}
}
else
{
ui->statusLabel->setText(ConvertCharArrayToQString("信号丢失!"));
return;
}
}
}
总结
注:获取GPS报文协议一般需要读取串口信息,需要在头文件添加
#include <QSerialPort>
#include <QSerialPortInfo>
如使用Qt Creator开发需要在.pro文件添加
QT += serialport
如果使用vs + Qt 插件开发则:右键解决方案-Qt Project Settings-Qt Modules,然后勾选Serial Port选项。
串口读取方法见串口读取(Qt C++)