помогите - Uno + GPS

ulasiuk
Offline
Зарегистрирован: 15.01.2016

Задумал сделать эмулятор DCF77. Будет DS1302 + генератор управляемый UNO. Получение точного времени по GPS. 

На первом этапе нужно получить время от GPS. Приемник VK16U6 настроил для передачи только GPZDA ($GPZDA, hhmmss.s, xx, xx, xxxx, xx, xx *hh <CR><LF >) скорость 19200. Хочу обойтись без TinyGPS. 

Код который должен получить по 1 символу GPZDA, склеить их и вывести в COM:


#include <SoftwareSerial.h>

SoftwareSerial gps(2, 3);
// variables
byte byteGPS = 0;
int i = 0;
int h = 0;
char GPS_ZDA[100]="";

void setup()
{
  Serial.begin(115200);
  gps.begin(19200);
  
  Serial.print("Начало ..."); 
  Serial.println();
  delay(1000);
}

void loop() 
{
  bool newdata = false; // данные не получены
  unsigned long start = millis(); // инициализируем чтение раз в 1 сек
  while (millis() - start < 1000) {
    if (readgps())
       newdata = true;
  }
  if (newdata) {
   Serial.print("GPZDA :  "); // если данные получены выводим по 1 символу
  h = 0;
  while(h  <  29){
    Serial.print(GPS_ZDA[h]);
    h++;
  }
   Serial.println();
}
}

bool readgps() {
  while (gps.available()) { // когда данные доступны
  byteGPS = gps.read();     // читаем байт
  while(byteGPS != '$'){    // если не $ то читаем еще раз
    byteGPS = gps.read();
  }
  GPS_ZDA[0]='$';           // как нашли $ начинаем заполнять GPS_ZDA
 
  i = 1;
    while(byteGPS != '*'){     // до того момента пока не появится * (или может тупо прочитать 30 байт - формат-то не меняется)             
      byteGPS = gps.read();         
  
      GPS_ZDA[i]=byteGPS;
      i++;                      
  }

          return true;        //   GPS_ZDA - заполнено новыми данными
    }
  
  return false;  // Если данных нет возвращанем "false"
}

 

 

Результат Что- то не то...  Знающие поможете?

nkk
nkk аватар
Offline
Зарегистрирован: 18.03.2016

Кто старое поменянет... Ну да ладно.

ulasiuk пишет:
gps.begin(19200);
давайте, 9600? И в модуле тоже.

ulasiuk пишет:

byteGPS = gps.read(); // читаем байт
while(byteGPS != '$')   byteGPS = gps.read();
GPS_ZDA[0]='$';       // как нашли $ начинаем заполнять GPS_ZDA
i = 1;
while(byteGPS != '*'){ // до того момента пока не появится * (или может тупо прочитать 30 байт - формат-то не меняется)             
  byteGPS = gps.read();         
  GPS_ZDA[i]=byteGPS;
  i++;                      
}

А у меня, вроде, и так рабтает:

char chGpsLint[128]; // Переменная для хранения GPS-строки,
byte btReaded;       // её длина.
...
btReaded = Serial.readBytesUntil('\n', chGpsLint, 128);