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.
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