# GPS LC29H in Python
## Preparation:
```cmd=
pip install pyserial
```
## Code in your mainFIle
```python=
import serial
import time
PORT = '/dev/ttyUSB1'
BAUDRATE = 115200
def parse_gga(gga):
parts = gga.split(',')
if len(parts) < 15:
return "GGA數據格式不完整"
result = []
if parts[1]:
time_str = parts[1]
hour = int(time_str[0:2])
minute = int(time_str[2:4])
second = float(time_str[4:])
result.append(f"UTC时间: {hour:02d}:{minute:02d}:{second:.2f}")
if parts[2] and parts[4]:
lat = float(parts[2][:2]) + float(parts[2][2:]) / 60
lat_dir = parts[3] rts[4][:3]) + float(parts[4][3:]) / 60
lon_dir = parts[5]
result.append(f"緯度: {lat:.6f}° {lat_dir}")
result.append(f"經度: {lon:.6f}° {lon_dir}")
if parts[6]:
quality = int(parts[6])
quality_desc = {
0: "無定位",
1: "GPS定位",
2: "差分GPS定位",
4: "RTK固定解",
5: "RTK浮点解"
}
result.append(f"定位質量: {quality} ({quality_desc.get(quality, '未知')})")
if parts[7]:
satellites = int(parts[7])
result.append(f"使用的衛星數量: {satellites}")
if parts[8]:
hdop = float(parts[8])
result.append(f"HDOP(水平精度因子): {hdop}")
if parts[9]:
altitude = float(parts[9])
altitude_unit = parts[10]
result.append(f"海拔: {altitude} {altitude_unit}")
return "\n".join(result)
def parse_rmc(rmc):
parts = rmc.split(',')
if len(parts) < 12:
return "RMC數據格式不完整"
result = []
status = parts[2]
result.append(f"定位狀態: {'有效' if status == 'A' else '無效'}")
if status != 'A':
result.append("警告: 位置數據無效!")
return "\n".join(result)
if parts[1] and parts[9]:
time_str = parts[1]
date_str = parts[9]
hour = int(time_str[0:2])
minute = int(time_str[2:4])
second = float(time_str[4:])
day = int(date_str[0:2])
month = int(date_str[2:4])
year = 2000 + int(date_str[4:6]) # 假设是21世纪
result.append(f"日期时间: {year}-{month:02d}-{day:02d} {hour:02d}:{minute:02d}:{second:.2f} UTC")
if parts[3] and parts[5]:
lat = float(parts[3][:2]) + float(parts[3][2:]) / 60
lat_dir = parts[4] # N或S
lon = float(parts[5][:3]) + float(parts[5][3:]) / 60
lon_dir = parts[6] # E或W
result.append(f"緯度: {lat:.6f}° {lat_dir}")
result.append(f"經度: {lon:.6f}° {lon_dir}")
# 速度
if parts[7]:
speed = float(parts[7]) * 1.852 # 从节转换为公里/小时
result.append(f"速度: {speed:.2f} km/h")
# 航向
if parts[8]:
course = float(parts[8])
result.append(f"航向: {course:.2f}°")
return "\n".join(result)
def parse_nmea(line):
if not line.startswith('$'):
return "非NMEA格式数据"
nmea_type = line.split(',')[0][1:]
if "GGA" in nmea_type:
print("GGA")
# print("\n" + "="*50)
return parse_gga(line)
elif "RMC" in nmea_type:
# print("\n" + "="*50)
print("RMC")
return parse_rmc(line)
else:
# return f"收到 {nmea_type} 类型的NMEA语句: {line}"
return "0"
def clean_nmea_data(raw_data):
if raw_data.count('$') > 1:
second_dollar = raw_data.find('$', 1)
return raw_data[second_dollar:]
return raw_data
def main():
try:
print(f"連接到GPS {PORT},Port rate {BAUDRATE}...")
ser = serial.Serial(PORT, BAUDRATE, timeout=1)
print(f"成功連結,開始接收...")
print("按 Ctrl+C 停止")
while True:
if ser.in_waiting > 0:
line = ser.readline().decode('ascii', errors='replace').strip()
if line.startswith('$'):
line = clean_nmea_data(line)
if parse_nmea(line) != "0":
print(parse_nmea(line))
time.sleep(0.1)
except KeyboardInterrupt:
print("\n程序已停止")
except Exception as e:
print(f"錯誤: {e}")
finally:
if 'ser' in locals() and ser.is_open:
ser.close()
print("串口已關閉")
if __name__ == "__main__":
main()
```
## Method to execute
### In powershell
1. To check if your device has connected
```
usbipd list
```
2. Check your device number and bind it
```
usbipd bind --busid= "your device number (such as 1-2)"
```
3. attch to your device
```
usbipd attach -b 1-2 -w
```
### In WSL
You can check your device with
```
lsusb
```