2015-06-01 3 views
0

Я сделал программу 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") 

ответ

0

Дополнительную информацию об исключении можно получить, распечатав.

try: 
    gps = ser2.readline() 
except Exception as e: 
    print('Read GPS failed: {0}'.format(e)) 

Вы также можете попробовать поставить arduino.flushInput() вне цикла. В зависимости от времени вы можете потерять некоторые данные.

Смежные вопросы