1、串口程序的基本功能我们已经完成了,我们来完成一个串口解析的功能,GPS的定位解析是一个比较常用的功能,这节课我们来解析GPS数据。
2、GPS数据格式为NEMA-0183数据格式,一般判断是否已经定位都是选择推荐定位信息也就是$GPRMC,,我们来看下一条GPS数据的内容:
$GPRMC,121252.000,A,3958.3032,N,11629.6046,E,15.15,359.95,070306,,,A*54
根据推荐定位信息的定义:
$GPRMC,1,2,3,4,5,6,7,8,910,11,12*hh
1)UTC时间,hhmmss(时分秒)格式
2) 定位状态,A=有效定位,V=无效定位
3) 纬度
4) N(北半球)或S(南半球)
5) 经度
6) E(东经)或W(西经)
7) 地面速率
12) 模式指示(A=自主定位,D=差分,E=估算,N=数据无效)
我们所需要的数据已经列出,我们实际的使用的北京时间是等于utc时间+8小时。
我们来看下GPS数据的格式,以$符号为开头,以来结尾,所以来写一个基本的语句判断函数。
串口读到的数据是bytes,我们在pythonwork目录新增一个文件gps.py,如下所示:
新增如下代码:
#coding:utf-8
class gps():
def __init__(self):
self.realdata=b''
self.fb=False
def Get_gps_data(self,sdata):
sl=[]
for e in sdata:
if e==0x24 and self.fb==False:
self.fb=True
if self.fb:
self.realdata+=bytes([e])
if e==0x0a and self.fb:
data=self.realdata.decode('utf-8','replace')
sl.append(data)
self.fb=False
self.realdata=b''
print(sl)
return sl
我们来调用验证一下:
g=gps()
sdata="$GPRMC,121252.000,A,3958.3032,N,11629.6046,E,15.15,359.95,070306,,,A*54".encode('utf-8')
g.Get_gps_data(sdata)
运行一下:
运行结果能判断以0x24开头以及0xa结尾的数据格式,当然在实际的串口数据读取中,有可能会出现0x0d 0x0a丢失的情况,所以我们增加一种情况的判定:
def Get_gps_data(self,sdata):
sl=[]
for e in sdata:
if e==0x24 and self.fb==False:
self.fb=True
self.realdata+=bytes([e])
if self.fb and e==0x0a:
self.realdata+=bytes([e])
data=self.realdata.decode('utf-8','replace')
sl.append(data)
self.fb=False
self.realdata=b''
elif e!=0x24 and self.fb:
self.realdata+=bytes([e])
elif e==0x24 and self.fb and len(self.realdata)>5:
data=self.realdata.decode('utf-8','replace')
sl.append(data)
self.realdata=b''
self.realdata+=bytes([e])
print(sl)
return sl
输入测试代码:
g=gps()
sdata="$GPRMC,121252.000,A,3958.3032,N,11629.6046,E,15.15,359.95,070306,,,A*54$GPRMC,121252.000,A,3958.3032,N,11629.6046,E,15.15,359.95,070306,,,A*54".encode('utf-8')
g.Get_gps_data(sdata)
运行一下:
3、校验GPS数据是否正确,以上面的函数确实可以将GPS数据判断出来,但是非GPS数据只要满足格式的也会筛选出来,所以我们需要校验GPS的数据格式是否正确,我们查看NEMA数据信息,在数据段*号后面的为校验值:
$GPRMC,121252.000,A,3958.3032,N,11629.6046,E,15.15,359.95,070306,,,A*54
比如上面数据,54就是从$后面的数据,*前面的数据通过异或校验而得到的数据值,增加函数如下:
def CheckGpsBuff(self,buff):
buff=buff.replace(