Skip to content

Instantly share code, notes, and snippets.

@tommyjtl
Created March 16, 2019 06:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tommyjtl/a792f74f27f0cd8382e6016fb5025589 to your computer and use it in GitHub Desktop.
Save tommyjtl/a792f74f27f0cd8382e6016fb5025589 to your computer and use it in GitHub Desktop.

Declaration:

#define GpsSerial  Serial1
#define DebugSerial Serial

struct
{
  char GPS_Buffer[80];
  bool isGetData;
  bool isParseData;
  char UTCTime[11];
  char latitude[11];
  char N_S[2];
  char longitude[12];
  char E_W[2];
  bool isUsefull;

  char latitudeLast[11];
  char longitudeLast[12];
} Save_Data;

const unsigned int gpsRxBufferLength = 600;
char gpsRxBuffer[gpsRxBufferLength];
unsigned int ii = 0;

Setup:

void setup() {
  GpsSerial.begin(9600);
  DebugSerial.begin(9600);

  Save_Data.isGetData = false;
  Save_Data.isParseData = false;
  Save_Data.isUsefull = false;
}

Main code

void loop()
{
  gpsRead();
  parseGpsBuffer();
  
  Serial.println(Save_Data.latitude);
  Serial.println(Save_Data.longitude);

}

Setup code:

void parseGpsBuffer()
{
  char *subString;
  char *subStringNext;
  if (Save_Data.isGetData)
  {
    Save_Data.isGetData = false;
    DebugSerial.println("**************");
    DebugSerial.println(Save_Data.GPS_Buffer);

    memcpy(Save_Data.latitudeLast, Save_Data.latitude, 11);
    memcpy(Save_Data.longitudeLast, Save_Data.longitude, 12);
    for (int i = 0 ; i <= 6 ; i++)
    {
      if (i == 0)
      {
        if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
          errorLog(1);
      }
      else
      {
        subString++;
        if ((subStringNext = strstr(subString, ",")) != NULL)
        {
          char usefullBuffer[2];
          switch (i)
          {
            case 1: memcpy(Save_Data.UTCTime, subString, subStringNext - subString); break;
            case 2: memcpy(usefullBuffer, subString, subStringNext - subString); break;
            case 3: memcpy(Save_Data.latitude, subString, subStringNext - subString); break;
            case 4: memcpy(Save_Data.N_S, subString, subStringNext - subString); break;
            case 5: memcpy(Save_Data.longitude, subString, subStringNext - subString); break;
            case 6: memcpy(Save_Data.E_W, subString, subStringNext - subString); break;

            default: break;
          }

          subString = subStringNext;
          Save_Data.isParseData = true;
          if (usefullBuffer[0] == 'A')
            Save_Data.isUsefull = true;
          else if (usefullBuffer[0] == 'V')
            Save_Data.isUsefull = false;

        }
        else
        {
          errorLog(2);
        }
      }


    }
  }
}


void gpsRead() {
  while (GpsSerial.available())
  {
    gpsRxBuffer[ii++] = GpsSerial.read();
    if (ii == gpsRxBufferLength)clrGpsRxBuffer();
  }

  char* GPS_BufferHead;
  char* GPS_BufferTail;
  if ((GPS_BufferHead = strstr(gpsRxBuffer, "$GPRMC,")) != NULL || (GPS_BufferHead = strstr(gpsRxBuffer, "$GNRMC,")) != NULL )
  {
    if (((GPS_BufferTail = strstr(GPS_BufferHead, "\r\n")) != NULL) && (GPS_BufferTail > GPS_BufferHead))
    {
      memcpy(Save_Data.GPS_Buffer, GPS_BufferHead, GPS_BufferTail - GPS_BufferHead);
      Save_Data.isGetData = true;

      clrGpsRxBuffer();
    }
  }
}

void clrGpsRxBuffer(void)
{
  memset(gpsRxBuffer, 0, gpsRxBufferLength);
  ii = 0;
}

void errorLog(int num)
{
  DebugSerial.print("ERROR");
  DebugSerial.println(num);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment