1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- #include "paregnrmc.h"
- #include <QDebug>
- PareGNRMC::PareGNRMC()
- {
- }
- bool PareGNRMC::verifyChecksum(const QString& sentence) {
- int index = sentence.indexOf('*');
- if (index == -1) {
- return false;
- }
- QString checksumStr = sentence.mid(index + 1);
- bool ok;
- int receivedChecksum = checksumStr.toInt(&ok, 16);
- if (!ok) {
- return false;
- }
- int calculatedChecksum = 0;
- for (int i = 1; i < index; ++i) {
- calculatedChecksum ^= sentence.at(i).toLatin1();
- }
- return calculatedChecksum == receivedChecksum;
- }
- RMCData PareGNRMC::parseRMC(const QString& input) {
- RMCData data;
- if (!input.startsWith("$GNRMC")) {
- data.isValid = false;
- return data;
- }
- QStringList sentences = input.split("\r\n");
- QString sentence = sentences.first();
- if (!verifyChecksum(sentence)) {
- data.isValid = false;
- return data;
- }
- QStringList fields = sentence.split(',');
- if (fields.size() < 13) {
- data.isValid = false;
- return data;
- }
- data.time = fields[1];
- data.isValid = (fields[2] == "A");
- if (data.isValid) {
- // 解析纬度
- QString latStr = fields[3];
- int latDeg = latStr.left(2).toInt();
- double latMin = latStr.mid(2).toDouble();
- data.latitude = latDeg + latMin / 60.0;
- data.latDirection = fields[4].at(0).toLatin1();
- // 解析经度
- QString lonStr = fields[5];
- int lonDeg = lonStr.left(3).toInt();
- double lonMin = lonStr.mid(3).toDouble();
- data.longitude = lonDeg + lonMin / 60.0;
- data.lonDirection = fields[6].at(0).toLatin1();
- data.speed = fields[7].toDouble();
- data.date = fields[9];
- }
- return data;
- }
- // 将 RMCData 转换为 QString
- QString PareGNRMC::rmcDataToString(const RMCData& data) {
- QString result;
- result += "Time: " + data.time + "\n";
- result += "Is Valid: " + QString(data.isValid ? "Yes" : "No") + "\n";
- if (data.isValid) {
- result += "Latitude: " + QString::number(data.latitude) + " " + data.latDirection + "\n";
- result += "Longitude: " + QString::number(data.longitude) + " " + data.lonDirection + "\n";
- } else {
- result += "Latitude: 未知\n";
- result += "Longitude: 未知\n";
- }
- result += "Speed: " + QString::number(data.speed) + "\n";
- result += "Date: " + data.date + "\n";
- return result;
- }
|