硬件:
(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()