NEO-6M Howto: thoughts on skipping GPGSV satellite data

Imagine you’re about to design some realtime (ok, near-realtime) GPS application with UBlox NEO-6M (NEO-6,7,8) receiver, and already implemented my tweaks as described earlier — boosting GPS 10x faster, and serial baudrate 12x faster. What will be your next bottleneck?


This is an example NMEA series of data your GPS receiver is sending to core cpu every measurement cycle, which means 10 times a second, if you have NEO set in 100ms mode. This not includes actual position data, which is basically doubles that char amount. Your library has to be able to receive, encode/process all this data, still leave some time to business application — assuming your device is not crunching NMEA data all the time, but pretending to do something useful.

My field lab with T-Beam NEO-6M and TTGO Lora32 as debug concole

Utilizing the trick we used earlier, with PUBX controls, let’s look at the docs. You have the ability to tell NEO- module “please don’t send me messages like these”, and apply PUBX CFG-MSG zero rate to our GPGSV, which {msgClass+msgID} pair is {0xF0, 0x03}.
Rate for now is obviously 0x00 (= mute).

GPGSV message, according to NMEA data,

GSV - Satellites in View: shows data about the satellites that the unit might be able to find based on its viewing mask and almanac data. It also shows current ability to track this data. Note that one GSV sentence only can provide data for up to 4 satellites and thus there may need to be 3 sentences for the full information. holding information what satellites are currently visible by device — not necessarily active and used — and what are their parameters.
Satellite ID, elevation, azimuth, SNR.

It’s very unlikely your application really needs that data, and needs it realtime updated 10 times a second, because sat positions are there still for about 20 years already, and shall they change all at once, reading GPS data on IoT will not be your first problem.

More to go: look, we have GPGSA message, which also holds active satellites information. And if you have GSV list muted, there’s still GSA to get data like “how many sats i’m using now”.

A solution? Sorry, not much, with NEO.

The problem is: when you are disabling sending NMEA GSV, it seems like NEO-6 receiver skips it’s processing as well. There’s nothing docs say about this, but you can try it yourself.

  • GSAs and fixes processing will work for satellites NEO knows/seen earlier,
  • when/if visibility changes, NEO will refuse to process data from unseen (by disabled GSV) satellites,
  • fixes will not be applied, leaving you with some unstable behavior,
  • and if your position changed significally, this will end you in a plain field under clear sky with “0 satellites found”

Sad but true. Probably it just not working that way. With NEO-6 (not tested on other devices but suggest something similar).

So, we can mute GSV, what it gives?

Pros: halves the serial data flow, not wasting time & memory on list processing (if any), halves the amount of NMEA messages count on UART as well, if you are using message-aligned reads;

Cons: leaves you/device without SatID listings, location fix update only from already seen satellites, only 4 satellites active to get fixes, satellite list will come to depletion if visibility changes, and possibly degraded to sats=0

So, as seen in cons, “disable GSV” makes our device unusable.

UPD: post-note on NEO-M8N — it seems that thing are not so bad with M8N chip, still need to run a bunch of tests but behaves at least better than 6', i’ll make a post when figure it out.

What can we do here?

  1. Set some rate to GSV message list, so NEO will process it 1/N times the measurement cycle. It’s the last parameter in CFG-MSG; but you’ll have once in 1/N cycles a pack of GSV data to process;
  2. Enable GSV-muted mode only for short time, when you really need burst mode and near-realtime data. It’s 10 complex GPS position updates per second, unlikely you need it for 95% applications all the time; bring it back when the rush conditions is over. Where applicable;
  3. Somehow track the degradation of fixes, number of active satellites on given time span, and enable GSV when visibility drops before some level. For example, consider we need at least 3 sats for position fix, we have 10 measurements per 1 second, so if during that full second you have seen only 30 (or less) used active satellites in GSA= that’s bad news, disable the mute, and wait for GPGSV list to update.

There’s one more bottleneck, on how you read and encode NEO data. Spoiler: code from vendor examples doesn’t work on high speeds and short delays.




CG Labs / Hardware — building some tech you may interested to.

Love podcasts or audiobooks? Learn on the go with our new app.

Recommended from Medium

Download OG WhatsApp (OG WA) Pro Mod Apk For iOS And Android

Download OG WhatsApp (OG WA) Pro Mod Apk For iOS And Android

How To Deploy Static Angular Website With Azure DevOps

ETL Data Pipeline and Data Reporting using Airflow, Spark, Livy and Athena for OneApp

Neovim for Beginner — Auto Pairs

Stream Torrent For Mac Download

Buy Twitter accounts for iPhone

AWS S3-Linux Useful Copy Commands

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store


CG Labs / Hardware — building some tech you may interested to.

More from Medium

NEM Pricing Tool

Build Text-Based & Talking Chatbots using the Microsoft Power Platform

Learn How to Manage Data By Modelling a Twisted Voxel Tower

Need of Data Privacy