Hello,
Im working on a project using the Grove Air530Z GPS receiver from Seeedstudio. I've successfully sent the module the proper CAS04 message to configure the system to use only the GPS constellation and sent the proper CAS15 message to enable all WAAS satellites (PRNs 131,133,135,and 138).
However, the GGA messages from the module only ever report a GPS fix, not a DGPS fix. Is this an issue other people have experienced?
Corresponding code is included below
// generic message fields
#define NMEA_MSG_START_CHAR '$'
#define NMEA_MSG_START_STR "$"
#define NMEA_TALKER_ID_LEN 2
#define NMEA_MSG_ID_INDEX 3
#define NMEA_MSG_ID_LEN 3
#define NMEA_TALKER_ID_GPS "GP"
#define NMEA_TALKER_ID_GNSS "GN"
#define NMEA_MSG_ID_GGA "GGA"
#define NMEA_MSG_ID_GSA "GSA"
#define NMEA_MSG_ID_GSV "GSV"
#define NMEA_MSG_ID_ZDA "ZDA"
#define NMEA_PROPRIETARY_HEADER_LEN 7
#define NMEA_PROPRIETARY_HEADER "PCAS"
#define NMEA_PROPRIETARY_HDR_SET_UPDATE_INTERVAL "02"
#define NMEA_PROPRIETARY_HDR_SET_MESSAGE_TYPE "03"
#define NMEA_PROPRIETARY_HDR_SET_WORKING_MODE "04"
#define NMEA_PROPRIETARY_HDR_SET_SATELLITES "15"
...
#define GPS_ONLY 1
...
// set constellation
GPSSerial.SetConstellations(GPS_ONLY);
...
// CAS04 message
void GPSSerial_::SetConstellations(uint8_t mode)
{
char buffer[NMEA_MAX_LINE_SIZE];
int rv = 1;
sprintf(buffer, NMEA_MSG_START_STR NMEA_PROPRIETARY_HEADER NMEA_PROPRIETARY_HDR_SET_WORKING_MODE
NMEA_DELIM_STR "%u", mode);
NMEA_ChecksumGenerator::AppendChecksumAndEnd(buffer);
// keep trying to write until there is room in the tx buffer
while (rv)
{
rv = Write(buffer);
}
}
// CAS15 messages
void GPSSerial_::SetSatellites()
{
char buffer[NMEA_MAX_LINE_SIZE];
int rv = 1;
// Turn off Beidou satellites 1-32
strcpy(buffer, NMEA_MSG_START_STR NMEA_PROPRIETARY_HEADER NMEA_PROPRIETARY_HDR_SET_SATELLITES
NMEA_DELIM_STR "2" NMEA_DELIM_STR "00000000");
NMEA_ChecksumGenerator::AppendChecksumAndEnd(buffer);
// keep trying to write until there is room in the tx buffer
while (rv)
{
rv = Write(buffer);
}
// Turn off Beidou satellites 33-64
strcpy(buffer, NMEA_MSG_START_STR NMEA_PROPRIETARY_HEADER NMEA_PROPRIETARY_HDR_SET_SATELLITES
NMEA_DELIM_STR "3" NMEA_DELIM_STR "00000000");
NMEA_ChecksumGenerator::AppendChecksumAndEnd(buffer);
rv = 1;
while (rv)
{
rv = Write(buffer);
}
// Turn on WAAS SBAS satellites 12,14,16,19 corresponding to the PRNs 131,133,135,and 138
// satallite index 1 corresponds to PRN 120
uint32_t sats = ( (1 << (131-120)) | \
(1 << (133-120)) | \
(1 << (135-120)) | \
(1 << (138-120)));
// should be 0x4A800
sprintf(buffer, NMEA_MSG_START_STR NMEA_PROPRIETARY_HEADER NMEA_PROPRIETARY_HDR_SET_SATELLITES
NMEA_DELIM_STR "4" NMEA_DELIM_STR "%05lX", sats);
NMEA_ChecksumGenerator::AppendChecksumAndEnd(buffer);
rv = 1;
while (rv)
{
rv = Write(buffer);
}
// Turn off QZSS satellites 1-5, Japan only
strcpy(buffer, NMEA_MSG_START_STR NMEA_PROPRIETARY_HEADER NMEA_PROPRIETARY_HDR_SET_SATELLITES
NMEA_DELIM_STR "5" NMEA_DELIM_STR "00");
NMEA_ChecksumGenerator::AppendChecksumAndEnd(buffer);
rv = 1;
while (rv)
{
rv = Write(buffer);
}
}