Ublox GPS receiving Characters but no data

Hey Guys,

I’m using the ublox max-m8c pico breakout with chip antenna because it is one of the only GPS unit that works to the heights I need as I’m making a data collection system for a weather balloon. I’m communicating via software serial on pins 3 and 4 with a 1k resistor on the line in which the GPS recieves from the transmitter. The VCC is on 3.3 and ground is on ground.

I’ve ran both the TinyGPS and TinyGPS++ Libraries to no avail. The baud rate of the GPS is 9600 and when this is changed in the examples, I receive characters but stars everywhere else indicating no lock/data. I’ve allowed the thing to run for 10 minutes still receiving no data. I’m outside.

Attached is the example code with the correct baud rate for my GPS along with a screenshot of the serial monitor. Thanks!

#include <SoftwareSerial.h>

#include <TinyGPS.h>

/* This sample code demonstrates the normal use of a TinyGPS object.
   It requires the use of SoftwareSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).

TinyGPS gps;
SoftwareSerial ss(4, 3);

static void smartdelay(unsigned long ms);
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);

void setup()
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println("Sats HDOP Latitude  Longitude  Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum");
  Serial.println("          (deg)     (deg)      Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail");


void loop()
  float flat, flon;
  unsigned long age, date, time, chars = 0;
  unsigned short sentences = 0, failed = 0;
  static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
  print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
  print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
  gps.f_get_position(&flat, &flon, &age);
  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2);
  print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
  print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
  print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
  print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE : TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);

  gps.stats(&chars, &sentences, &failed);
  print_int(chars, 0xFFFFFFFF, 6);
  print_int(sentences, 0xFFFFFFFF, 10);
  print_int(failed, 0xFFFFFFFF, 9);

static void smartdelay(unsigned long ms)
  unsigned long start = millis();
    while (ss.available())
  } while (millis() - start < ms);

static void print_float(float val, float invalid, int len, int prec)
  if (val == invalid)
    while (len-- > 1)
    Serial.print(' ');
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
      Serial.print(' ');

static void print_int(unsigned long val, unsigned long invalid, int len)
  char sz[32];
  if (val == invalid)
    strcpy(sz, "*******");
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 0) 
    sz[len-1] = ' ';

static void print_date(TinyGPS &gps)
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned long age;
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  if (age == TinyGPS::GPS_INVALID_AGE)
    Serial.print("********** ******** ");
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
        month, day, year, hour, minute, second);
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);

static void print_str(const char *str, int len)
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');

Screen Shot 2016-12-06 at 2.15.24 PM.png

Image embedded for our convenience:


Technique described here. But next time, just copy and paste the text into a code block.

I receive characters but… no lock/data.

I would suggest trying the diagnostic program in my library, NeoGPS. It will try various baud rates and display the data it does receive. NeoGPS is available from the link or the Arduino IDE Library Manager (Sketch → Include Library… → Manage Libraries). It will default to using pins 4 & 3 on an UNO.

NeoGPS is smaller, faster, more reliable and more accurate than all other libraries. You can configure it to only parse the messages and fields that you really use, saving even more program space and RAM. The example programs are structured correctly, so that you can modify them without breaking them (usually ;)). Many people have trouble modifying other libraries’ examples.

Also, SoftwareSerial is very inefficient. It disables interrupts for long periods of time, which can interfere with other parts of your sketch, or other libraries.

It would be best if you could put the GPS on pins 8 & 9 and use AltSoftSerial. If you can’t move the GPS to those pins, try NeoSWSerial. It is almost as efficient and it works on any two pins. It only works at bauds 9600, 19200 and 38400, which should be ok for the GPS device.

All the NeoGPS examples have the same serial port choices at the top. Just uncomment one of the serial include files, and the example will use that kind of port. For software serial ports, it defaults to pins 4 & 3 (see comments and/or step 3 in the Installation Instructions).


@aaronp12345, do not cross-post. Other thread removed.

I've allowed the thing to run for 10 minutes still receiving no data. I'm outside.

It can take much longer than that for a GPS to get the first "cold start" fix.

The ‘diagnostics’ you are using do not really tell you what’s happening, if you look at the links page here;


There is a dropbox location where you will find programs within the HAB folder for testing the Ublox GPS I use for my HAB trackers. These are echo program that simply copy what the GPS is spewing out to the serial terminal, so that you can see the progress of the GPS in acquiring a fix by viewing the actual NMEA being output. In particular the GSV sentence will tell you how many satellites there are in view and the signal strengths.

A Ublox GPS with ceramic antenna will often pick up a fix within 1 minute from cold, 10 minutes or more suggests a fault to me, probably a damaged antenna input. Unfortunately the Ublox GPSs are extremely sensitive to static damage on the antenna input and some breakout boards may not fit the recommended protection components so great care in handling is required.

The TinyGPS++ library works very well and reliably in my trackers, although with the Ublox its probably better to use its I2C interface (I do in my HAB tracker programs) rather than softserial.

at least one model of Ublox GPS... does NOT send the * that marks the end of a sentence

Do you remember where you saw this?

In the early 2000's, ublox version 1 and 2 chips had a configuration command ($PSRF103) that would let you turn it off. There is no such command in NEO-5 or later.

Do you remember where you saw this?

No. I know that in my early days on the (old) forum, problems with UBlox GPSs were quite common, because they did not all return the * as part of the NMEA data.