python 串口_第十二课python来写串口助手-gps数据解析(一)

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,如下所示:

97b2797a906429aaeb000370c54fc7c3.png

新增如下代码:

#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)

运行一下:

5daf7123bba1a8b2fc872448eaa10ab2.png

运行结果能判断以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)

运行一下:

fec21500d219d685b0a065c2935e5ea0.png

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(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值