python版的简单gps解析仪

   安装相应的python包, apt-get install python-tk,apt-get install python-serial,pip install image.

代码如下

#encoding=utf-8
from Tkinter import *
import tkMessageBox
from PIL import Image, ImageTk
from serial import *
import threading
import time
import datetime
from decimal import Decimal
'''
	self.j=1
	if self.j==1:
		data="$GPGSV,3,1,10,18,84,067,23,09,67,067,27,22,49,312,28,15,47,231,30*70 "
	if self.j==2:
		data="$GPGSV,3,2,10,21,32,199,23,14,25,272,24,05,21,140,32,26,14,070,20*7E "
	if self.j==3:
		data="$GPGSV,3,3,10,29,07,074,,30,07,163,28*7D "
	if self.j==4:
		data="$GPRMC,025620.20,A,2602.33722,N,11911.49176,E,0.100,,281211,,,D*79 "
	if self.j==5:
		data="$GPGGA,121253.000,3937.3090,N,11611.6057,E,1,06,1.2,44.6,M,-5.7,M,,0000*72 "
	if self.j==6:
		data="$GPVTG,359.95,T,,M,15.15,N,28.0,K,A*04 "
	if self.j==7:
		data="$GPGSA,A,3,14,15,05,22,18,26,,,,,,,2.1,1.2,1.7*3D "
	self.j=self.j+1
	if(self.j==8):
		self.j=1;
'''
class GUI(Frame):
    def __init__(self, frame=None):
        Frame.__init__(self, frame)
       
        self.ser = Serial()
	self.ser.baudrate=9600
        self.ser.port='/dev/ttyUSB0'

        self.gprmc_item=['UTC时间','定位状态','纬度','纬度半球','经度','经度半球','地面速率','地面航向', 'UTC日期','磁偏角','磁偏角方向']
	self.gpgga_item=['UTC时间','纬度','纬度半球','经度','经度半球','定位状态','定位使用卫星','HDOP水平精度因子', '海拔高度','高度','差分时间','差分站ID']
	self.gpgsa_item=['模式','定位类型','卫星编号','卫星编号','卫星编号','卫星编号','卫星编号','卫星编号','卫星编号','卫星编号','卫星编号','卫星编号','卫星编号','卫星编号','PDOP位置精度因子','HDOP水平精度因子','VDOP垂直精度因子']
	self.gpgsv_item_one=['GSV语句总数','GSV编号','可见卫星','卫星编号','卫星仰角','卫星方位角','信噪比','卫星编号','卫星仰角','卫星方位角','信噪比','卫星编号','卫星仰角','卫星方位角','信噪比','卫星编号','卫星仰角','卫星方位角','信噪比']
	self.gpgsv_item_two=['GSV语句总数','GSV编号','可见卫星','卫星编号','卫星仰角','卫星方位角','信噪比','卫星编号','卫星仰角','卫星方位角','信噪比','卫星编号','卫星仰角','卫星方位角','信噪比','卫星编号','卫星仰角','卫星方位角','信噪比']
	self.gpgsv_item_three=['GSV语句总数','GSV编号','可见卫星','卫星编号','卫星仰角','卫星方位角','信噪比','卫星编号','卫星仰角','卫星方位角','信噪比']
	self.gpvtg_item=['地面航向(真北)','地面航向(地磁)','地面速率(节)','地面速率(km/h)']
	self.gprmc_value=['','','','','','','','', '','','','']
	self.gpgga_value=['','','','','','','','', '','','','']
	self.gpgsa_value=['','','','','','','','', '','','','','','','','','', '','','']
	self.gpgsv_value_one=['','','','','','','','', '','','','','','','','','','','', '','']
	self.gpgsv_value_two=['','','','','','','','', '','','','','','','','','','','', '','']
	self.gpgsv_value_three=['','','','','','','','', '','','','','','','','','','','', '','']
	self.gpvtg_value=['','','','','','','','', '','','','']
	for i in range(0,len(self.gprmc_item)):
		self.gprmc_value[i]=StringVar()
		Label(frame,relief="flat",text=self.gprmc_item[i], width=10).grid(row = i,column = 0,sticky = W)
		Label(frame,relief="groove",textvariable=self.gprmc_value[i], width=13).grid(row = i,column = 1,sticky = W)
	for i in range(0,len(self.gpgga_item)):
		self.gpgga_value[i]=StringVar()
		Label(frame,relief="flat",text=self.gpgga_item[i], width=15).grid(row = i,column = 2,sticky = W)
		Label(frame,relief="groove",textvariable=self.gpgga_value[i], width=10).grid(row = i,column = 3,sticky = W)
	for i in range(0,len(self.gpgsa_item)):
		self.gpgsa_value[i]=StringVar()
		Label(frame,relief="flat",text=self.gpgsa_item[i], width=15).grid(row = i,column = 4,sticky = W)
		Label(frame,relief="groove",textvariable=self.gpgsa_value[i], width=8).grid(row = i,column = 5,sticky = W)
	for i in range(0,len(self.gpvtg_item)):
		self.gpvtg_value[i]=StringVar()
		Label(frame,relief="flat",text=self.gpvtg_item[i], width=13).grid(row = i,column = 6,sticky = W)
		Label(frame,relief="groove",textvariable=self.gpvtg_value[i], width=8).grid(row = i,column = 7,sticky = W)
	for i in range(0,len(self.gpgsv_item_one)):
		self.gpgsv_value_one[i]=StringVar()
		Label(frame,relief="flat",text=self.gpgsv_item_one[i], width=10).grid(row = i,column = 8,sticky = W)
		Label(frame,relief="groove",textvariable=self.gpgsv_value_one[i], width=8).grid(row = i,column = 9,sticky = W)
	for i in range(0,len(self.gpgsv_item_two)):
		self.gpgsv_value_two[i]=StringVar()
		Label(frame,relief="flat",text=self.gpgsv_item_two[i], width=10).grid(row = i,column = 10,sticky = W)
		Label(frame,relief="groove",textvariable=self.gpgsv_value_two[i], width=8).grid(row = i,column = 11,sticky = W)
	for i in range(0,len(self.gpgsv_item_three)):
		self.gpgsv_value_three[i]=StringVar()
		Label(frame,relief="flat",text=self.gpgsv_item_three[i], width=10).grid(row = i,column = 12,sticky = W)
		Label(frame,relief="groove",textvariable=self.gpgsv_value_three[i], width=8).grid(row = i,column = 13,sticky = W)
  
    def analysisgpsdata(self,data):
	list=data.split(',')
	if list[0]=='$GPGSA':
		for i in range(0,len(self.gpgsa_item)):
			if i==0:
				if(cmp(list[1],'A')==0):
					list[1]='自动'
				else:
					list[1]='手动'
			if i==1:
				if(cmp(list[2],'1')==0):
					list[2]='未定位'
				if(cmp(list[2],'2')==0):
					list[2]='二维定位'
				if(cmp(list[2],'3')==0):
					list[2]='三维定位'
		
			if i==len(self.gpgsa_item)-1:
				tmp_list=list[len(self.gpgsa_item)].split('*')
				list[len(self.gpgsa_item)]=tmp_list[0]
			self.gpgsa_value[i].set(list[i+1])
	elif list[0]=='$GPGSV':
			if(cmp(list[2],'1')==0):
				for i in range(0,len(self.gpgsv_item_one)):
					if i==(len(self.gpgsv_item_one)-1):
						tmp_list=list[i+1].split('*')
						list[i+1]=tmp_list[0]
					self.gpgsv_value_one[i].set(list[i+1])
			if(cmp(list[2],'2')==0):
				for i in range(0,len(self.gpgsv_item_two)):
					if i==(len(self.gpgsv_item_two)-1):
						tmp_list=list[i+1].split('*')
						list[i+1]=tmp_list[0]
					self.gpgsv_value_two[i].set(list[i+1])
			if(cmp(list[2],'3')==0):
				for i in range(0,len(self.gpgsv_item_three)):
					if i==(len(self.gpgsv_item_three)-1):
						tmp_list=list[i+1].split('*')
						list[i+1]=tmp_list[0]
					self.gpgsv_value_three[i].set(list[i+1])
			
	elif list[0]=='$GPGGA':
		for i in range(0,len(self.gpgga_item)):
			if i==0:
				hour=int(float(list[1])/10000)
				hour=hour+8
				if hour>24:
					hour=hour-24
				list[1]=str(hour)+':'+str(int(float(list[1])%10000/100))+':'+str(int(float(list[1])%100))
			if i==1:
				du=float(list[2])//100
				du=du+(float(list[2])-du*100)/float(60)
				du=Decimal(du).quantize(Decimal('0.00000'))	
				list[2]=du
			if i==3:
				du=float(list[4])//100
				du=du+(float(list[4])-du*100)/float(60)
				du=Decimal(du).quantize(Decimal('0.00000'))	
				list[4]=du
			if i==5:
				if(cmp(list[6],'0')==0):
					list[6]='未定位'
				if(cmp(list[6],'1')==0):
					list[6]='非差分定位'
				if(cmp(list[6],'2')==0):
					list[6]='差分定位'
				if(cmp(list[6],'6')==0):
					list[6]='正在估算'
			if i==9:
				list[i+1]=list[i+1+1]
			if i==(len(self.gpgga_item)-2):
				list[i+1]=list[i+3]
			if i==(len(self.gpgga_item)-1):
				tmp_list=list[i+3].split('*')
				list[i+1]=tmp_list[0]

			self.gpgga_value[i].set(list[i+1])
	elif list[0]=='$GPRMC':
		for i in range(0,len(self.gprmc_item)):
			if i==0:
				hour=int(float(list[1])/10000)
				hour=hour+8
				if hour>24:
					hour=hour-24
				list[1]=str(hour)+':'+str(int(float(list[1])%10000/100))+':'+str(int(float(list[1])%100))
			if i==1:
				if(cmp(list[2],'A')==0):
					list[2]='有效'
				else:
					list[2]='无效'
			if i==2:
				du=float(list[3])//100
				du=du+(float(list[3])-du*100)/float(60)
				du=Decimal(du).quantize(Decimal('0.00000'))	
				list[3]=du
			if i==4:
				du=float(list[5])//100
				du=du+(float(list[5])-du*100)/float(60)
				du=Decimal(du).quantize(Decimal('0.00000'))	
				list[5]=du
			if i==8:
			
				date=int(list[i+1])
				list[i+1]=str(2000+date%100%100)+'年'+str(date%10000//100) +'月'+str(date//10000)+'日'
			self.gprmc_value[i].set(list[i+1])
	
	elif list[0]=='$GPVTG':
		for i in range(0,len(self.gpvtg_item)):
			if i==1:
				list[i+1]=list[i+2]
			if i==2:
				list[i+1]=list[i+3]
			if i==3:
				list[i+1]=list[i+4]
			self.gpvtg_value[i].set(list[i+1])
	else:
	 	print 'unkown data'
		print data
		print list
	
    def getgpsdata(self):
	serialdata = self.ser.readline()
	self.analysisgpsdata(serialdata);
        self._timer = self.after(1, self.getgpsdata)

        
    def open(self):
	try:
        	self.ser.open()
	except Exception, e:
		print 'serial open err'
	if self.ser.is_open==True:
		print(self.ser)
		self.getgpsdata()

    def close(self):
	self.showSerial.delete(0.0,END)
        self.ser.close()
        self.showSerial.insert(0.0,"Serial close ok")

class ITEM_BAR(object):
	def __init__(self,parent):
		self.root=parent;	  
		option = Menu(self.root)
		self.root.config(menu=option)
		filemenu = Menu(option,tearoff=0)
		option.add_cascade(label="选项", menu=filemenu)
		filemenu.add_command(label="分析数据", command=self.analyze_data)
		filemenu.add_command(label="退出", command=self.root.quit)
		helpmenu = Menu(option,tearoff=0)
		option.add_cascade(label="帮助", menu=helpmenu)
		helpmenu.add_command(label="关于软件", command=self.about)
	def analyze_data(self):
		GUI().open()
	def about(self):
    		tkMessageBox.showinfo("关于软件", "http://blog.csdn.net/mike8825/")


root = Tk()   
root.title("GPS Analyzer")
root.resizable(False, False)
app = GUI(root)
ITEM_BAR(root)
root.mainloop()
效果图


猜你喜欢

转载自blog.csdn.net/mike8825/article/details/78522967
今日推荐