GPS-модуль GY-GPS6MV2 возвращает только цифры

У меня GY-GPS6MV2 подключен к Nano. (Также пробовал UNO, результат тот же). RX GPS подключается к TX Nano PIN 3, а TX GPS — к TX 4 Nano.

Когда я запускаю код ниже, я получаю только набор цифр. Похоже, это не шестнадцатеричные числа.

36718082776744448644444444444444444444478425351131036718086847144444444444444444478425148131036718071716544444444444448444844

Я использую следующий код

#include <SoftwareSerial.h>

String data = "";

// Определить контакты Arduino для последовательной связи программного обеспечения
const int RXPin = 4;
const int TXPin = 3;

// Установите скорость передачи данных по умолчанию для GPS-модуля NEO-6M
const int GPSBaud = 9600;

// Создать программный последовательный объект для связи GPS
SoftwareSerial gpsSerial(RXPin, TXPin);

void setup() {
  // Запускаем аппаратный последовательный порт для связи с компьютером
  Serial.begin(9600);

  // Запустить программный последовательный порт для связи с GPS
  gpsSerial.begin(GPSBaud);
}

void loop() {
  data = "";
  // Проверяем, есть ли данные от GPS-модуля
  while (gpsSerial.available()>0) {
    // Считываем входящие данные и отправляем их на компьютер
      data += gpsSerial.read();
  }

    // Считываем входящие данные и отправляем их на компьютер
  Serial.println(data);
  delay(30000);
}

Я попробовал два разных GPS-модуля, и результат тот же. Похоже, GPS отправляет мне данные через Arduino, но неверные. Я читал о холодном запуске, поэтому оставил модуль работать более 30 часов, но результат тот же. Я знаю, что он может не видеть спутники, и ожидал увидеть от него какие-то NMEA-данные, пусть даже и бессмысленные.

Что я упустил при создании этой работы?

, 👍1

Обсуждение

используйте разделитель при печати значений, например ,, @jsotola

исследование значений ASCII, @jsotola

Извините, как это поможет преобразовать строку ASCII в NMEA?, @TomTheTec

это не строка ASCII ... это набор числовых значений ... отображайте их как текст ASCII, а не как числа, @jsotola

3671808277674444... — это код ASCII для "$GPRMC,,..., поэтому вы правильно получаете данные, но выполняете неправильную конкатенацию данных. При программировании на C/C++ всегда нужно знать, с каким типом данных вы имеете дело. gpsSerial.read() возвращает [int](https://github.com/PaulStoffregen/SoftwareSerial/blob/master/SoftwareSerial.h#L130), поэтому вам нужно привести его к char, прежде чем вы сможете выполнить конкатенацию со строкой с помощью data += (char) gpsSerial.read();., @hcheung

@hcheung — Спасибо за помощь, это именно то, что мне было нужно. C/C++ для меня в новинку, поэтому я не знал, что нужно приводить значения. Теперь программа выдаёт символы, осталось только заставить GPS-модуль увидеть спутники. Сегодня запущу её на улице., @TomTheTec


1 ответ


Лучший ответ:

2

Когда вы пишете gpsSerial.read(), вы вызываете метод

int SoftwareSerial::read();

Обратите внимание, что он возвращает int, а не char. Вы можете спросить: «Почему?». Причина заключается в том, что char может содержать только 256 различных значений, тогда как это метод может возвращать 257 различных значений:

  • Значения от 0 до 255 представляют собой фактическое количество байтов, считанных из порта
  • Значение −1 представляет собой состояние ошибки.

В вашем случае вам не придется беспокоиться об ошибках, так как вы всего лишь вызывая метод, когда вы точно знаете, что у него есть данные для доставки (т. е. когда gpsSerial.available()>0).

Когда вы пишете data += gpsSerial.read();, вы вызываете метод

String & String::operator += (int num);

Которая добавляет число к строке. На первый взгляд, это выглядит так. бессмысленно. Что вообще может означать «добавить число к строке»? Библиотека Arduino интерпретирует это как «запишите число в десятичное число, используя цифры ASCII, и добавьте это к строке». Таким образом, если ты

data += 36;

Это добавит строку "36" к data.

Теперь, если вы вместо этого

data += (char) 36,

Это добавит к data символ номер 36, то есть '$'. А это чего вы на самом деле хотите. Итак:

data += (char) gpsSerial.read();
,