基于树莓派ttyAMA0和串口GPS模块的定位信息解析脚本

硬件:

(1)树莓派1B

(2)GPS模块(串口输出,NMEA格式,串口数据率为4800bps)

(3)杜邦线

软件:

Raspbian Jessie Lite操作系统

安装Python3及其serial模块。

 

软件设置:

运行 raspi-config,设置启用serial硬件,但不作为系统访问接口。

 

硬件连接:

RaspberryPi       GPS_Module

+5V                              +5V

GND                           GND

RXD                           TXD

 

GPS数据接收

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import serial

class GPSReceiver:
    comm = serial.Serial()
    
    def open(self, port, baud_rate=4800, parity='N', stop_bits=2, byte_size=8):
            
        
        
        self.comm = serial.Serial()
        self.comm.baudrate = baud_rate
        self.comm.port = port #'/dev/ttyUSB0'

        try:
            self.comm.open()
        except:
            pass
        
        return
    
    
    def is_open(self):
        return self.comm.is_open
    
    
    def readline(self):
        if self.is_open():
            line = self.comm.readline()
        else:
            print('GPSReceiver is not open yet.')
            line = ''
        
        return line
    
    
    def close(self):
        self.comm.close()


def test():
    gps = GPSReceiver()
    gps.open('/dev/ttyS0', 4800)
    
    print('GPS open status: %s'%gps.is_open())
    
    while True:
        print(gps.readline())
    
    gps.close()
    

if __name__ == '__main__':
    test()

GPS数据解析

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
import GPSReceiver


class GPSBucket:
    '''
    '''
    def __init__(self):
        self.gps_status_dict = {'0':'初始化', '1':'单点定位', '2':'码差分',\
                       '3':'无效PPS', '4':'固定解', '5':'浮点解',\
                       '6':'正在估算', '7':'人工输入固定值', '8':'模拟模式',\
                       '9':'WAAS差分'}
    
        self.tm_year   = 0
        self.tm_month  = 0
        self.tm_day    = 0
        self.tm_hour   = 0
        self.tm_minute = 0
        self.tm_second = 0.0

        self.longitude_deg = 0.0
        self.latitude_deg  = 0.0
        self.sea_height = 0.0
        self.error_height = 0.0
        
        self.satellite_num = 0
        
        self.magnetic_angle_deg = 0.0
        
        self.gps_status = ''
        self.data_status = ''
        return
    
        
    def translate_gps_status(self, status):
        return self.gps_status_dict.get(status)
        
    
    def gps_bin_to_str(self, gps_diagram):
        gps_str = str(gps_diagram)
        gps_str = gps_str.lstrip("b'")
        gps_str = gps_str.rstrip(r"\r\n'")
        return gps_str
    
    
    def dm_to_deg(self, dm, NS_EW, as_longitude):
        if as_longitude == True:
            d = float(dm[:3])
            m = float(dm[3:])
        else:
            d = float(dm[:2])
            m = float(dm[2:])
        
        if NS_EW == 'N' or NS_EW == 'E':
            deg = d + m/60
        else:
            deg = -(d + m/60)
        
        return deg
    
    
    def parse_GPGGA(self, gps_str):
        [name, tm, lat, NS, lon, EW, gps_status, satellite_num, HDOP,\
         sea_height, error_height, *unused] = gps_str.split(',')
        
        self.tm_hour = int(tm[:2])
        self.tm_minute = int(tm[2:4])
        self.tm_second = float(tm[4:])
        #print('UTC Time %s:%s:%s'%(hour, minute, second))
        
        self.latitude_deg = self.dm_to_deg(lat, NS, False)
        self.longitude_deg = self.dm_to_deg(lon, EW, True)
        self.gps_status = self.translate_gps_status(gps_status)
        self.satellite_num = int(satellite_num)
        
        if len(sea_height) > 0:
            self.sea_height = float(sea_height)
        
        error_height = error_height.rstrip('M')
        
        if len(error_height) > 0:
            self.error_height = float(error_height)
            
        return


    def parse_GPRMC(self, gps_str):
        [name, tm, data_status, lat, NS, lon, EW, velocity,\
         move_direction, date, magnetic_angle, magnetic_angle_EW,\
         *unused] = gps_str.split(',')
        
        self.tm_hour = int(tm[:2])
        self.tm_minute = int(tm[2:4])
        self.tm_second = float(tm[4:])
        #print('UTC Time %s:%s:%s'%(hour, minute, second))
        
        if data_status == 'A':
            self.data_status = '有效定位'
        else:
            self.data_status = '无效定位'
        
        self.latitude_deg = self.dm_to_deg(lat, NS, False)
        self.longitude_deg = self.dm_to_deg(lon, EW, True)
        self.tm_day = int(date[:2])
        self.tm_month = int(date[2:4])
        self.tm_year = int(date[4:]) + 2000
        
        if len(magnetic_angle) > 0:
            self.magnetic_angle_deg = float(magnetic_angle)
        
        if magnetic_angle_EW == 'W':
            self.magnetic_angle_deg = -self.magnetic_angle_deg
        
        return


    def feed(self, gps_diagram):
        gps_str = self.gps_bin_to_str(gps_diagram)
        #print(gps_str)

        signature = gps_str[:6]
        #print(signature)
        
        if signature   == '$GPGSV': # 可视卫星状态输出
            pass # do not process
        elif signature == '$GPRMC': # 推荐定位信息
            self.parse_GPRMC(gps_str)
        elif signature == '$GPGGA': # GPS数据输出
            self.parse_GPGGA(gps_str)
            pass
        elif signature == '$GPGSA': # 当前卫星信息
            pass # should be parsed, but no use for current job.
        elif signature == '$GPVTG': # 地面速度信息
            pass # should be parsed, but no use for current job.
        elif signature == '$GPGLL': # 地理定位信息
            pass # should be parsed, but no this diagram for current GPS module
        else: # invalid gps diagram
            pass
        
        
    def output(self):
        s = "%04d-%02d-%02d %02d:%02d:%4.5f SAT:%s GPS:%s DATA:%s "\
        %(self.tm_year, self.tm_month, self.tm_day,\
          self.tm_hour, self.tm_minute, self.tm_second, self.satellite_num,\
          self.gps_status, self.data_status )
        
        s += "L:%s B:%s H:%s EH:%s"\
        %(self.longitude_deg, self.latitude_deg, self.sea_height,\
          self.error_height)
        return s
        
def test():
    gps = GPSReceiver.GPSReceiver()
    bucket = GPSBucket()
    
    gps.open('/dev/ttyAMA0', 4800)
    
    while gps.is_open():
        gps_diagram = gps.readline()
        #gps_str = gps_bin_to_str(gps_diagram)
        
        bucket.feed(gps_diagram)
        
        s = bucket.output()
        print(s)
        
        #time.sleep(1)
        
    
    print('Fail to open GPSReceiver')


if __name__ == '__main__':
    test()

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值