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-данные, пусть даже и бессмысленные.
Что я упустил при создании этой работы?
@TomTheTec, 👍1
Обсуждение1 ответ
Лучший ответ:
Когда вы пишете 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();
- Sim800L Проблемы с загрузкой, HTTPACTION возвращает 0, 302, 701
- vk2828u7g5lf GPS модуль над SoftwareSerial
- Обновление GPS через каждые 30 секунд с помощью NeoGPS и NeoSWSerial Libray
- Нет данных GPS Neo 6M DFRduino Nano
- Arduino не записывает полное предложение NMEA в файл SD-карты
- Насколько "быстро" могут обновляться данные GPS во время движения и зависит ли это от mcu?
- Можно ли переключиться с Serial на SoftwareSerial во время выполнения с той же скоростью передачи данных?
- avrdude ser_open() can't set com-state
используйте разделитель при печати значений, например
,, @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