1 Star 3 Fork 4

TMRNic/LabTool-V2

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
gnss_parse.cpp 5.91 KB
一键复制 编辑 原始数据 按行查看 历史
TMRNic 提交于 2024-12-04 16:14 +08:00 . 完成GNSS接收保存测试
#include "gnss_parse.h"
// 解析 GPGGA 报文的函数
bool parseGPGGA(const QString& gpgga, GPGGAData& data) {
// 假设 GPGGA 报文格式为:
// $GPGGA,hhmmss.sss,ddmm.mmmm,N,dddmm.mmmm,E,f,x,satellites,HDOP,altitude,geoidHeight,,differentialStationID
// 1. 去除报文的前缀部分 "$GPGGA,"
QString cleanedGPGGA = gpgga;
if (cleanedGPGGA.startsWith("$GPGGA,") || cleanedGPGGA.startsWith("$GNGGA,")) {
cleanedGPGGA.remove(0, 7); // 移除 "$GPGGA,"
}
// 2. 分割报文字段
QStringList fields = cleanedGPGGA.split(',');
// 3. 检查报文字段数目是否符合预期
if (fields.size() < 14) {
qWarning() << "Invalid GPGGA message, expected 15 fields.";
return false;
}
// 4. 解析字段
bool ok;
data.utcTime = fields[0]; // UTC 时间(字符串格式)
// 解析纬度
data.latitude = fields[1].left(2).toDouble(&ok) + fields[1].mid(2).toDouble(&ok) / 60.0;
if (!ok) return false;
data.latitudeDirection = fields[2].at(0).toLatin1();
// 解析经度
data.longitude = fields[3].left(3).toDouble(&ok) + fields[3].mid(3).toDouble(&ok) / 60.0;
if (!ok) return false;
data.longitudeDirection = fields[4].at(0).toLatin1();
// 定位质量(0-3)
data.fixQuality = fields[5].toInt(&ok);
if (!ok) return false;
// 卫星数量
data.numSatellites = fields[6].toInt(&ok);
if (!ok) return false;
// 水平精度(HDOP)
data.hdop = fields[7].toDouble(&ok);
if (!ok) return false;
// 海拔高度(单位:米)
data.altitude = fields[8].toDouble(&ok);
if (!ok) return false;
// 海平面高度(单位:米)
data.geoidHeight = fields[9].toDouble(&ok);
if (!ok) return false;
return true;
}
// 解析GPVTG报文的函数
bool parseGPVTG(const QString& gpvtg, GPVTGData& data) {
// 假设GPVTG报文格式如下:
// $GPVTG,<trueHeading>,T,<magHeading>,M,<speedKnots>,N,<speedKmh>,K
// 示例:$GPVTG,180.0,T,175.0,M,15.0,N,27.0,K
// 1. 去除报文的前缀部分 "$GPVTG,",如果有的话
QString cleanedGPVTG = gpvtg;
if (cleanedGPVTG.startsWith("$GPVTG,") || cleanedGPVTG.startsWith("$GNVTG,")) {
cleanedGPVTG.remove(0, 7); // 移除 "$GPVTG,"
}
// 2. 分割报文字段
QStringList fields = cleanedGPVTG.split(',');
// 3. 检查报文字段数目是否符合预期
if (fields.size() != 8) {
qWarning() << "Invalid GPVTG message, expected 8 fields.";
return false;
}
// 4. 解析字段
bool ok;
data.trueHeading = fields[0].toDouble(&ok); // 真航向
if (!ok) return false;
// 跳过 "T" 字段
if (fields[1] != "T") {
qWarning() << "Invalid GPVTG message, expected 'T' after true heading.";
return false;
}
data.magneticHeading = fields[2].toDouble(&ok); // 磁航向
if (!ok) return false;
// 跳过 "M" 字段
if (fields[3] != "M") {
qWarning() << "Invalid GPVTG message, expected 'M' after magnetic heading.";
return false;
}
data.speedKnots = fields[4].toDouble(&ok); // 速度,单位:节
if (!ok) return false;
// 跳过 "N" 字段
if (fields[5] != "N") {
qWarning() << "Invalid GPVTG message, expected 'N' after speed in knots.";
return false;
}
data.speedKmh = fields[6].toDouble(&ok); // 速度,单位:千米每小时
if (!ok) return false;
// 跳过 "K" 字段
if (fields[7] != "K") {
qWarning() << "Invalid GPVTG message, expected 'K' after speed in km/h.";
return false;
}
return true;
}
bool parseNovAV(const QString& bestvel, NovAVData& data) {
// 假设bestvel报文的格式如下:
// $BESTVEL,123.456,789.012,345.678,50.0,0.5,1.2,5.0,0.1
// 其中字段为:
// 1. 北向速度 (m/s)
// 2. 东向速度 (m/s)
// 3. 上向速度 (m/s)
// 4. 航向 (度)
// 5. 3D速度 (m/s)
// 6. 速度不确定度 (m/s)
// 7. 速度不确定度 (m/s)
// 8. 水平精度 (m/s)
QStringList fields = bestvel.split(',');
// 检查报文是否符合预期字段数目
if (fields.size() < 8) {
qWarning() << "Invalid BESTVEL message!";
return false;
}
// 解析字段并存储到NovAPData中
bool ok;
data.week = fields[5].toDouble(&ok);
if (!ok) return false;
data.second = fields[6].toDouble(&ok);
if (!ok) return false;
data.velocityH = fields[13].toDouble(&ok);
if (!ok) return false;
data.heading = fields[14].toDouble(&ok);
if (!ok) return false;
data.velocityU = fields[15].toDouble(&ok);
if (!ok) return false;
return true;
}
// 解析 BESTPOS 报文的函数
bool parseNovAP(const QString& bestpos, NovAPData& data) {
// 假设报文格式为:
// $BESTPOS,latitude,longitude,height,hdop,vdop,status,timestamp
// 示例: $BESTPOS,37.7749,-122.4194,150.0,1.5,2.3,1,2024-12-01T12:34:56
// 1. 去除可能的报文前缀 "$BESTPOS,"
QString cleanedBestPos = bestpos;
if (cleanedBestPos.startsWith("$BESTPOS,")) {
cleanedBestPos.remove(0, 9); // 移除 "$BESTPOS,"
}
// 2. 分割报文字段
QStringList fields = cleanedBestPos.split(',');
// 3. 检查报文字段数目是否符合预期
if (fields.size() != 8) {
qWarning() << "Invalid BESTPOS message, expected 8 fields.";
return false;
}
// 4. 解析字段
bool ok;
data.latitude = fields[0].toDouble(&ok);
if (!ok) return false;
data.longitude = fields[1].toDouble(&ok);
if (!ok) return false;
data.height = fields[2].toDouble(&ok);
if (!ok) return false;
data.hdop = fields[3].toDouble(&ok);
if (!ok) return false;
data.vdop = fields[4].toDouble(&ok);
if (!ok) return false;
data.status = fields[5].toInt(&ok);
if (!ok) return false;
data.timestamp = fields[6]; // 假设时间戳字段是字符串格式
return true;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/tmrnic/lab-tool-v2.git
git@gitee.com:tmrnic/lab-tool-v2.git
tmrnic
lab-tool-v2
LabTool-V2
main

搜索帮助