2017-05-05 180 views
0

因此,我正在使用GPS modulePythonMySQL database进行应用程序。Python GPS数据捕获

所以我写了一些代码,尝试从GPS捕获数据并将其存储在数据库中。我使用名为“pynmea2”的插件来解析一些数据(经度和纬度)。然而,我需要更多的数据,所以,我已经尝试了不同的东西,但是我的程序一直在崩溃。有人可以帮我解决这个问题吗?

大多数情况下,我从串行连接中获取所有数据,但我希望能够从中删除数据。因此,例如我所得到的:[b'$GPGGA,093512.000,,,,,0,3,,,M,,M,,*47\r\n', b'$GPGLL,,,,,093512.000,V,N*76\r\n', b'$GPGSA,A,1,,,,,,,,,,,,,,,*1E\r\n', b'$GPGSV,3,1,11,15,72,214,,24,52,276,,13,48,141,,17,31,093,29*70\r\n', b'$GPGSV,3,2,11,18,28,292,,28,27,049,25,19,24,120,24,12,23,211,13*7E\r\n', b'$GPGSV,3

嗯,这不是那么简单从中提取数据,但它的作品只是罚款与pynmea2库(库我允许使用

所以,我现在需要速度,经度和纬度,但现在速度让我困扰,它给了ValueError: could not convert string to float: "22*49\\r\\n'" 很多次,因为我没有找到正确的方式找到数据然后“解析”它。

这是我目前使用的代码;

from model.GPSParser import GPSParser 
from model.DB import DB 
import serial 
import time 
import datetime 
import pynmea2 

######################################### 
# This is the main code to setup the 
# serial connection with the GPS module. 
# it needs to be OR runt as root OR as 
# pi with all the root rights. 
######################################### 
port = "/dev/ttyAMA0" 
ser = serial.Serial(port, 9600, timeout=0) 

######################################### 
# These are all the global variables 
# to be used. All defined and set to 
# zero or their standard 'Null' value. 
######################################### 
lat = 0.0 
lon = 0.0 
cur_speed = 0.0 


while True: 

    try: 
     # Get the data from the serial monitor. 
     data = str(ser.readlines()).lstrip("b'")[:-3] 
     # print(data) 

     ######################################### 
     # Find the speed, to check if we're 
     # standing still or not. Save it in a 
     # @var speed 
     ######################################### 
     if data.find('$GPVTG') != -1: 
      cur_speed = data.split(",")[7] 

     ######################################### 
     # Get the Latitude and Longitude 
     ######################################### 
     if data.find('$GPGGA') != -1: 
      print(data) 
      # Check whether the data strings are empty or not. 
      if GPSParser.parseLatitude(data) != "" and GPSParser.parseLongitude(data) != "": 
       lat = GPSParser.parseLatitude(data) 
       lon = GPSParser.parseLongitude(data) 
       # Debug printing 
       # print("Latitude: " + GPSParser.parseLatitude(data)) 
       # print("Longitude: " + GPSParser.parseLongitude(data)) 
       # print("Speed: " + cur_speed) 

     ######################################### 
     # Insert the coordinates into the database 
     # Be sure to check of we are really driving 
     # So when the speed is higher then 5 km/u 
     # Store everything into the database. 
     ######################################### 
     if float(cur_speed) > 5.0: 
      db = DB() 
      db.insertCoordinates(lat, lon, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) 

     # Wait a bit to not overload the Serial port 
     time.sleep(0.5) 

    ############################################################ 
    # The error handling 
    ############################################################ 
    except serial.serialutil.SerialException: 
     ser.close() 
     port = "/dev/ttyAMA0" 
     ser = serial.Serial(port, 9600, timeout=0) 
     continue 
    except pynmea2.ParseError: 
     # print("Error on parsing object, continuing...") 
     continue 
    except BlockingIOError: 
     # print("Blocking I/O error, continuing...") 
     continue 
    except TypeError: 
     # print("Type error, continuing...") 
     continue 
    except IndexError: 
     # print("To catch an error...") 
     continue 
    except KeyboardInterrupt: 
     print("\nProgram stopped.") 
     exit() 

因此,从模型导入并没有太大的作用,只有数据库连接和“gps解析器”只是解析一串数据然后返回它的pynmea。


所以,我想是这样的:

它得到的所有数据是每秒一次脉冲, 它,然后将其分解全部纳入夹头在那里与$GP变量开始,然后我可以搜索对于第二个可变部分,例如VTGGGA。然后我可以使用该字符串将转换为正确的值,以根据需要提取速度,纬度,经度和其他数据。

希望你们能理解我并能帮助我。

+0

已经有在pynmea2一个串行读数[示例](https://github.com/Knio/pynmea2/blob/master/examples/serial.py) repo –

+0

的确如此,除非你会读完整个问题,否则你会看到你无法解析速度。 – Robin

回答

1

不确定这是否解决了您的问题,但pynmea2具有速度属性,在talker.py中定义。

import pynmea2 
for i, line in enumerate(open('/tmp/nmea.txt').readlines()): 
    # parsing via pynmea 
    msg = pynmea2.parse(line.strip()) 
    if msg.sentence_type == 'VTG': 
     print ('parsing line %s with pynmea:' % i, float(msg.spd_over_grnd_kmph)) 

    # parsing via manually 
    if line.startswith('$GPVTG'): 
     cur_speed = line.split(",")[7] 
     print ('parsing line %s manually:' % i, float(cur_speed)) 

返回:

parsing line 1 with pynmea: 91.626 
parsing line 1 manually: 91.626 
parsing line 10 with pynmea: 90.842 
parsing line 10 manually: 90.842 
parsing line 19 with pynmea: 89.676 
parsing line 19 manually: 89.676 
+0

我会测试一下,并告知你它是否正常工作。 – Robin

+0

经过测试,但行'data = pynmea2.parse(line.strip())'给了我以下错误:'AttributeError:'list'object has no attribute'strip'' – Robin

+0

尝试在您的原始代码中:cur_speed = float(data.split(“,”)[7] .strip()) –