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