linux python 解析 PL2303设备的原始数据

一、借助GPS定位仪记录经纬度信息的小伙伴,可以最下面代码解析设备的原始信息;

#-*- coding: utf-8 -*-
import serial
import serial.tools.list_ports
import os
import re
from log import *
import time

class GPSModuleControl:

    def __init__(self):
        self.device_name='Prolific Technology, Inc. PL2303 Serial Port'


    def get_ttyusb(self):
        cm = os.popen('ls /dev/ttyUSB*')
        ttyusb = cm.readlines()
        cm.close()
        ttyusb_list = []
        for usb in ttyusb:
            ttyusb_list.append(usb.strip().split(r'/')[-1])
        return ttyusb_list
        
    def get_dev_ttyusb(self):
        devid = self.get_device_id()
        product = 'grep PRODUCT= /sys/bus/usb-serial/devices/%s/../uevent'
        if devid:
            for ttyusb in self.get_ttyusb():
                cm = os.popen(product % ttyusb)
                lines= cm.readlines()[0]
                cm.close()
                m=re.search('PRODUCT=(\w+)/(\w+)',lines)
                if (m.group(1)==devid[0]) and (m.group(2)==devid[1]):
                    break
            return ttyusb
        else:
            return None
            
    def get_device_id(self):
        cm = os.popen('lsusb')
        usbdevice = cm.readlines()
        cm.close()
        strTemp=None
        
        for dev in usbdevice:
            if self.device_name in dev:
                strTemp=re.search('ID (\w+):(\w+)',dev)
                break
        if strTemp == None:
            print('No gps device')
            return None
        else:
            devid=[]
            devid.append(strTemp.group(1).strip('0'))
            devid.append(strTemp.group(2).strip('0'))
        return devid

    def getGPSData(self):
        strReturn=""
        strPortName=self.get_dev_ttyusb()
        if strPortName==None:
            log("No GPS Module port")
            return strReturn
        log("GPS Module port is:"+strPortName)
        ser = serial.Serial('/dev/'+strPortName, 4800, timeout=3)
        count=0
        while 30-count>0:
            strGPSData = ser.readline()
            if strGPSData.find("GPGGA")>=0:
                strReturn=strGPSData
                break
            time.sleep(1)
            count+=1
        ser.close()
        log("GPS DATA is:"+strReturn)
        return strReturn
    
if __name__ == '__main__':
    GPSmodule=GPSModuleControl()
    GPSmodule.getGPSData()

二、GPGGA数据含义
$GPGGA

例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,0000*1F

字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data(GGA)GPS定位信息

字段1:UTC 时间,hhmmss.sss,时分秒格式

字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)

字段3:纬度N(北纬)或S(南纬)

字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)

字段5:经度E(东经)或W(西经)

字段6:GPS状态,0=未定位,1=非差分定位,2=差分定位,3=无效PPS,6=正在估算

字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)

字段8:HDOP水平精度因子(0.5 - 99.9)

字段9:海拔高度(-9999.9 - 99999.9)

字段10:地球椭球面相对大地水准面的高度

字段11:差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)

字段12:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)

字段13:校验值

三、若使用其他原始数据,具体NEMA-0183协议请自行百度,包括( G P R M C 、 GPRMC、 GPRMCGPGSV、$GPGSA)

四、注意这里得到的经纬度,属于度分格式,需要换算成一般格式,例如:14718.5084 ==> 147+18.5084/60=147.3084733333333333(WGS坐标系) ,若要转换成百度坐标系,高德坐标系,谷歌坐标系都有相应的规则,这里就不多阐述了,可以参考相应的开发文档!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值