paregnrmc.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "paregnrmc.h"
  2. #include <QDebug>
  3. PareGNRMC::PareGNRMC()
  4. {
  5. }
  6. bool PareGNRMC::verifyChecksum(const QString& sentence) {
  7. int index = sentence.indexOf('*');
  8. if (index == -1) {
  9. return false;
  10. }
  11. QString checksumStr = sentence.mid(index + 1);
  12. bool ok;
  13. int receivedChecksum = checksumStr.toInt(&ok, 16);
  14. if (!ok) {
  15. return false;
  16. }
  17. int calculatedChecksum = 0;
  18. for (int i = 1; i < index; ++i) {
  19. calculatedChecksum ^= sentence.at(i).toLatin1();
  20. }
  21. return calculatedChecksum == receivedChecksum;
  22. }
  23. RMCData PareGNRMC::parseRMC(const QString& input) {
  24. RMCData data;
  25. if (!input.startsWith("$GNRMC")) {
  26. data.isValid = false;
  27. return data;
  28. }
  29. QStringList sentences = input.split("\r\n");
  30. QString sentence = sentences.first();
  31. if (!verifyChecksum(sentence)) {
  32. data.isValid = false;
  33. return data;
  34. }
  35. QStringList fields = sentence.split(',');
  36. if (fields.size() < 13) {
  37. data.isValid = false;
  38. return data;
  39. }
  40. data.time = fields[1];
  41. data.isValid = (fields[2] == "A");
  42. if (data.isValid) {
  43. // 解析纬度
  44. QString latStr = fields[3];
  45. int latDeg = latStr.left(2).toInt();
  46. double latMin = latStr.mid(2).toDouble();
  47. data.latitude = latDeg + latMin / 60.0;
  48. data.latDirection = fields[4].at(0).toLatin1();
  49. // 解析经度
  50. QString lonStr = fields[5];
  51. int lonDeg = lonStr.left(3).toInt();
  52. double lonMin = lonStr.mid(3).toDouble();
  53. data.longitude = lonDeg + lonMin / 60.0;
  54. data.lonDirection = fields[6].at(0).toLatin1();
  55. data.speed = fields[7].toDouble();
  56. data.date = fields[9];
  57. }
  58. return data;
  59. }
  60. // 将 RMCData 转换为 QString
  61. QString PareGNRMC::rmcDataToString(const RMCData& data) {
  62. QString result;
  63. result += "Time: " + data.time + "\n";
  64. result += "Is Valid: " + QString(data.isValid ? "Yes" : "No") + "\n";
  65. if (data.isValid) {
  66. result += "Latitude: " + QString::number(data.latitude) + " " + data.latDirection + "\n";
  67. result += "Longitude: " + QString::number(data.longitude) + " " + data.lonDirection + "\n";
  68. } else {
  69. result += "Latitude: 未知\n";
  70. result += "Longitude: 未知\n";
  71. }
  72. result += "Speed: " + QString::number(data.speed) + "\n";
  73. result += "Date: " + data.date + "\n";
  74. return result;
  75. }