1. 程式人生 > >linux python 解析 PL2303裝置的原始資料

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協議請自行百度,包括(GPRMCGPRMC、GPGSV、$GPGSA)

四、注意這裡得到的經緯度,屬於度分格式,需要換算成一般格式,例如:14718.5084 ==> 147+18.5084/60=147.3084733333333333(WGS座標系) ,若要轉換成百度座標系,高德座標系,谷歌座標系都有相應的規則,這裡就不多闡述了,可以參考相應的開發文件!