Arduino не записывает полное предложение NMEA в файл SD-карты - PullRequest
0 голосов
/ 11 января 2020

В настоящее время я строю небольшую коробку GPS, которая должна отслеживать мое местоположение и записывать полное предложение NMEA на SD-карту.
(я хочу потом проанализировать его на моем p c)
Я использую Arduino Nano и NEO-6M GPS-модуль для получения данных.

Что работает: получение данных NMEA из модуля, запись на SD-карту.
Вывод данных на последовательный выход через Serial.write работает нормально.

Теперь у меня проблема в том, что Arduino не может записать данные достаточно быстро на SD-карту и выполнить десинхронизацию с помощью GPS модуль. Иногда это приводит к следующим вещам: $G3,3,09,32,20,248,*4D

У меня есть несколько идей, как это исправить:
1. Пишите данные быстрее
2. Всегда ждите, пока данные будут полностью записаны, прежде чем получать следующее исправление
3. только запись каждого второго GPS-исправления
4. сначала запись в буфер, а затем одним go на SD-карту

Я пытался реализовать их, но не смог каждый раз (извините, я новичок в этом).

Вот мой текущий код:

#include <SoftwareSerial.h>
#include <SPI.h>
#include <SD.h>

SoftwareSerial GPS_Serial(4, 3); // GPS Module’s TX to D4 & RX to D3
File GPS_File;
int NBR = 1;  //file number

void setup() {
  Serial.begin(9600);
  GPS_Serial.begin(9600);
  SD.begin(5);

  //write data to a new file
  bool rn = false;
  while (rn == false) {
    if (SD.exists(String(NBR) + ".txt")) {
      NBR = NBR + 1;
    }
    else {
      GPS_File = SD.open(String(NBR) + ".txt", FILE_WRITE);
      GPS_File.write("START\n");
      GPS_File.close();
      rn = true;
    }
  }
}

void loop() {                                               
  GPS_File = SD.open(String(NBR) + ".txt", FILE_WRITE);

  while (GPS_Serial.available() > 0) {
    GPS_File.write((byte)GPS_Serial.read());
  }
  GPS_File.close();
}

1 Ответ

0 голосов
/ 13 января 2020

Попробовав разные подходы, я решил довести его до самого базового уровня c.
Без какого-либо сложного кодирования или буферов, я сейчас просто записываю данные прямо на SD-карту и сбрасываю каждые 15 секунд, что может привести к потере до 15 секунд данных, т.е. 15 GPS-исправлений (1 в секунду) при отключении питания.

Единственный случай, когда возможна потеря данных, наблюдается, когда программа сбрасывает накопленные данные на SD. Хотя это происходит не каждый раз.

Для анализа предложений NMEA в пригодных для использования данных я использую GPSBabel. Он автоматически игнорирует ломаные линии. После преобразования в .gpx я просматриваю его с помощью Google Планета Земля.

Это "готовый" код:

#include <SoftwareSerial.h>
#include <SPI.h>
#include <SD.h>

SoftwareSerial GPS_Serial(4, 3);  // GPS Module’s TX to D4 & RX to D3
File GPS_File;
int NBR = 1;                      //file number

unsigned long TimerA;             //save timer
bool sw = false;                  //save timer switch

void setup() {
  Serial.begin(9600);
  GPS_Serial.begin(9600);
  SD.begin(5);                    //SD Pin

  //write data to a new file
  bool rn = false;
  while (rn == false) {
    if (SD.exists(String(NBR) + ".txt")) {
      NBR = NBR + 1;
    }
    else {
      GPS_File = SD.open(String(NBR) + ".txt", FILE_WRITE);
      GPS_File.write("START\n");
      rn = true;
    }
  }
}

void loop() {
  while (GPS_Serial.available() > 0) {
    GPS_File.write(GPS_Serial.read());
  }

  //set up timer
  if ( sw == false) {
    TimerA = millis();
    sw = true;
  }

  //save every 15 seconds
  if (millis() - TimerA >= 15000UL) {
    GPS_File.flush();
    sw = false;
  }
}
...