Search code examples
pythonchecksumtry-exceptnmea

Is there a way to bypass ChecksumError in pynmea2 while processing NMEA data in Python?


I am developing a program to take latitude and longitude data through NMEA sentences sent by a Sparkfun RTK Surveyor and store them in two different .txt files.

I am using pynmea2 and pyserial to get the geographic data, but the program always end with a pynmea2 ChecksumError message. Is there a way to ignore this error because it is not important to me. I know I can use try/except but I do not know how to use it.

This is the program:

import pynmea2
import serial
import io
from pyproj import Proj
import numpy as np

# --------------------------------------------------------------------------------------------------------------------------------------------------- #

# Variables
lat_Rover1 = []
lat_Rover2 = []
lon_Rover1 = []
lon_Rover2 = []

# --------------------------------------------------------------------------------------------------------------------------------------------------- #  

# Defining serial port to a variable
# ROVER 1
serial_port_Rover1 = 'COM3'
ser_Rover1 = serial.Serial(serial_port_Rover1, timeout=3)

# ROVER 2
serial_port_Rover2 = 'COM4'
ser_Rover2 = serial.Serial(serial_port_Rover2, timeout=3)
sio_Rover1 = io.TextIOWrapper(io.BufferedRWPair(ser_Rover1, ser_Rover1))
sio_Rover2 = io.TextIOWrapper(io.BufferedRWPair(ser_Rover2, ser_Rover2))

# --------------------------------------------------------------------------------------------------------------------------------------------------- #
k = 0
while True:
    # Reading NMEA data from Rovers
    
    line_Rover1 = sio_Rover1.readline()
    line_Rover2 = sio_Rover1.readline()
    msg_Rover1 = pynmea2.parse(line_Rover1, check=False)
    msg_Rover2 = pynmea2.parse(line_Rover2, check=False)

    try:
        msg_Rover1.sentence_re.match(line_Rover1)
        msg_Rover2.sentence_re.match(line_Rover2)
    except:
        pass
           
# --------------------------------------------------------------------------------------------------------------------------------------------------- #

    # Appending data to latitude and longitude list values
    if msg_Rover1.sentence_type == 'GLL':
        with open("NMEAOutputs_Rover1.txt", "a") as outputs:
            
            # Getting only
            # lat and lon as GLL
                lat_Rover1.append(-pynmea2.dm_to_sd(msg_Rover1.data[0]))
                lon_Rover1.append(-pynmea2.dm_to_sd(msg_Rover1.data[2]))
                print(lat_Rover1[k],";",lon_Rover1[k],";", pynmea2.timestamp(msg_Rover1.data[4]), file=outputs)

    if msg_Rover2.sentence_type == 'GLL':
        with open("NMEAOutputs_Rover2.txt", "a") as outputs:
            
            # Getting only lat and lon as GLL
                lat_Rover2.append(-pynmea2.dm_to_sd(msg_Rover2.data[0]))
                lon_Rover2.append(-pynmea2.dm_to_sd(msg_Rover2.data[2]))
                print(lat_Rover2[k],";",lon_Rover2[k],";", pynmea2.timestamp(msg_Rover2.data[4]), file=outputs)
    
    k += k

This is an example of a ChecksumError message:

File "c:\Users\Maua\Documents\MauabusNav\Navigation\main.py", line 48, in <module>
msg_Rover1 = pynmea2.parse(line_Rover1, check=False)
  File "C:\Users\Maua\Documents\MauabusNav\Mauabusnav\lib\site-packages\pynmea2\nmea.py", line 115, in parse
    raise ChecksumError(
pynmea2.nmea.ChecksumError: ('checksum does not match: 16 != 5A', ['$GNRMC', '195119.25', 'A', '2338.9631993', 'S', '04634.4401829', 'W', '0.082', '', '300523', '', '', 'A', 'V'])

By the way, I am new to StackOverflow so please be more patient since I do not know how to properly ask a question here.

I tried to use the try/except in the program with a error check function I found on the pynmea2 git codes. But I don't think it worked.


Solution

  • you should try something like this:

    while True:
        # Reading NMEA data from Rovers
        
        line_Rover1 = sio_Rover1.readline()
        line_Rover2 = sio_Rover1.readline()
      
        try:
            msg_Rover1 = pynmea2.parse(line_Rover1)
            # use msg_Rover1 here
    
        except (pynmea2.ChecksumError, pynmea2.ParseError) as e:
            print("Error parsing data: " + repr(line_Rover1))
        
    
         # repeat for Rover2