Я сделал программу python, которая считывает данные gps из последовательного порта. GPS-шайба непрерывно передает данные NMEA-данных при подключении к USB-порту. Моя программа открывает порт, а затем пытается прочитать данные, проанализировать его и затем записать в текстовый файл вместе с другими данными, вытащенными из Arduino.чтение python из последовательного порта GPS
Проблема, с которой я сталкиваюсь, заключается в том, что время от времени она не считывает данные при первом запуске программы. Я включил некоторые попытки Try/Exception и обнаружил, что он некорректно считывает данные из последовательного порта GPS.
Если я ударил Cntrl-C пару раз, это, похоже, выбило из проблемы его столкновение, а затем оно начало работать нормально. Я склонен думать, что это проблема синхронизации, когда GPS в потоковой передаче и когда программа пытается прочитать последовательный буфер.
Очевидно, что я сделал что-то неправильно в своем коде. Я просто ударил его как можно лучше, и для моих целей он отлично работает, но может сделать с небольшой помощью, чтобы сделать его более твердым, чтобы другие люди, которые могли его использовать, не смущали его шелушащимся поведением.
Здесь он внизу (некоторые из отступов неверны из-за скопирования с помощью Notepad ++). Любая помощь будет большой.
import serial
import pynmea2
import time
#####Global Variables######################################
#be sure to declare the variable as 'global var' in the functions
ID = 0
arduino = 0
ser2 = 0
fh = ""
rssi_dB = 0
gps = "NaN"
# User configurable
gps_com_port = 19 # com 19 Shop7 at Hm 8
arduino_com_port = 18 # com 18 Shop7 at Hm 6
# MCS2000 specific conversion rates
# DON'T CHANGE!!!
slope1 = 0.0170
slope2 = 0.008
slope3 = 0.020
slope4 = 0.000
cutoff1 = 700
cutoff2 = 430
cutoff3 = 380
cutoff4 = 0
cutoff5 = 0
y_int1 = 3.399
y_int2 = 2.692
y_int3 = 3.949
#####FUNCTIONS#############################################
#initialize serial connection
def init_serial():
COMNUM1 = arduino_com_port #set you COM port # here
COMNUM2 = gps_com_port
global arduino #must be declared in each fxn used
global ser2
arduino = serial.Serial(
port = COMNUM1 -1,
baudrate = 9600,
timeout = 1
)
ser2 = serial.Serial(
port = COMNUM2 -1,
baudrate = 4800,
timeout = 1
)
if arduino.isOpen():
print 'Open: ' + arduino.portstr
if ser2.isOpen():
print 'Open: ' + ser2.portstr
def init_file():
filename = raw_input('Enter save file[name.txt]:')
global fh
fh = open(filename,"w")
def rssi_convert(rssi):
#print ("rssi_convert\n")
if rssi<=cutoff1 and rssi>=cutoff2:
rssi_dB=((rssi*0.004888)-y_int1)/slope1
if rssi<=cutoff2 and rssi>=cutoff3:
rssi_dB=((rssi*0.004888)-y_int2)/slope2
if rssi<=cutoff3 and rssi>=cutoff4:
rssi_dB=((rssi*0.004888)-y_int3)/slope3
#if rssi<=cutoff4 and rssi>=cutoff5:
# rssi_dB=((rssi*0.004888)-2.047)/slope4
return float(rssi_dB)
#####SETUP################################################
#this is a good spot to run your initializations
init_file()
init_serial()
time.sleep(2)
data_log = "TOD,Lat,Long,Alt,Qual,Ref_ID,Num_Sat,Hor_Dil,RSSI\n"
fh.writelines(data_log) #write header to file
rssi = arduino.readline()
while str(rssi) == "A":
arduino.write("q")
rssi = arduino.readline()
#####MAIN LOOP############################################
while 1:
arduino.flushInput()
try:
gps = ser2.readline()
except:
print("Read GPS FAILED\n")
try:
gps_msg = pynmea2.parse(gps)
except:
print("Failed to parse GPS\n")
try:
if gps_msg.sentence_type == 'GGA':
arduino.write("q")
time.sleep(.2)
rssi = arduino.readline()
try:
rssi_dB = rssi_convert(float(rssi.strip('\0')))
except:
print("RSSI Conversion FAILED\n")
try:
data_log = str(gps_msg.timestamp) + "," + str(gps_msg.latitude) + "," + str(gps_msg.longitude) + "," + str(gps_msg.altitude) + "," + str(gps_msg.gps_qual) + "," + str(gps_msg.ref_station_id) + "," + str(gps_msg.num_sats) + "," + str(gps_msg.horizontal_dil) + "," + str(rssi_dB) + "\n"
print str(ID) + data_log
fh.writelines(data_log) #write data to file
ID = int(ID) + 1
except:
pass#ID=ID+1
except:
print("GPS Sentence Loop Failed")