備忘錄_20160105(定位) 修改 回首頁

程式 2026-04-08 17:22:08 1775640128 100
neo-6m (gps) + raspberry pi 4/5

neo-6m (gps) + raspberry pi 4/5

# 記得打開樹莓派4/樹莓派5的 Serial Port

# NEO-6M的 VCC -- 樹莓派的 3.3V
# NEO-6M的  RX -- 樹莓派的 TX
# NEO-6M的  TX -- 樹莓派的 RX
# NEO-6M的 GND -- 樹莓派的 GND

# 白面朝天空

import serial
from datetime import datetime, timedelta

def getFRealDeg(strVal, strDir):
  
  if strDir in ['N','S']:
    iDegLen=2
  else:
    iDegLen=3
  
  iDeg=int(strVal[:iDegLen])
  fMin=float(strVal[iDegLen:])
  
  fFinalDeg=iDeg+fMin/60
  
  if strDir in ['S','W']:
    fFinalDeg=-fFinalDeg
  
  return fFinalDeg

oSerial=serial.Serial("/dev/serial0", 9600, timeout=1)

while True:
  strLine=oSerial.readline().decode('ascii', errors='ignore')
  
  if strLine.startswith('$GPRMC') or strLine.startswith('$GNRMC'):
    lstPart=strLine.split(',')
    
    strMessageType=lstPart[0]
    
    strUTCTime=lstPart[1]
    iHour=int(strUTCTime[0:2])
    iMin=int(strUTCTime[2:4])
    fSec=float(strUTCTime[4:])
    
    strStatus=lstPart[2] # Void/Active
    
    strLatVal=lstPart[3] # 
    strLatDir=lstPart[4] # North/South
    strLonVal=lstPart[5] # 
    strLonDir=lstPart[6] # East/West
    
    fLat=getFRealDeg(strLatVal, strLatDir)
    fLon=getFRealDeg(strLonVal, strLonDir)
    
    strSpeedOverGround=lstPart[7] # knots
    strTrackAngle=lstPart[8]
    
    strDDMMYY=lstPart[9]
    iYear=2000+int(strDDMMYY[4:6])
    iMonth=int(strDDMMYY[2:4])
    iDay=int(strDDMMYY[0:2])
    
    strMagneticVariationVal=lstPart[10]
    strMagneticVariationDir=lstPart[11]
    strMode=lstPart[12] # Autonomous/Differential/Estimated
    strChecksum=strMode[1:]
    strMode=strMode[0:1]
    
    oDT=datetime.strptime(strDDMMYY+strUTCTime, "%d%m%y%H%M%S.%f")
    oDTAsiaTaipei=oDT+timedelta(hours=8)
    
    print("----------------------------")
    print("strMessageType", strMessageType)
    print("oDTAsiaTaipei", oDTAsiaTaipei)
    print("date", iYear, iMonth, iDay)
    print("strUTCTime", strUTCTime)
    print("strStatus", strStatus)
    print("fLat", fLat)
    print("fLon", fLon)
    print("strSpeedOverGround", strSpeedOverGround)
    print("strTrackAngle", strTrackAngle)
    print("strMagneticVariationVal", strMagneticVariationVal)
    print("strMagneticVariationDir", strMagneticVariationDir)
    print("strMode", strMode)
    print("strChecksum", strChecksum)
    print("")