树莓派(四):GPS连接并读取

时间:2024-04-10 13:14:39

0 准备

树莓派(四):GPS连接并读取
从左到右分别是GPS模块,USB转TTL串口,GPS天线
网上有一些文章是串口版的,直接将gps模块安装到树梅派上,不推荐那样做,因为那样做要更改许多文件,而且对树梅派使用也有一定影响,总之usb接口的是最简单的。

1 连线

杜邦线共使用4根线:
USB的TXD和GPS模块的RXD
USB的RXD和GPS模块的TXD
USB的GND和GPS模块的GND
USB的VCC和GPS模块的VCC
连好后将天线与GPS模块相连,放到窗外,USB串口插到树莓派的usb上

2 软件安装

sudo apt-get install minicom

安装好后使用minicom命令获取串口上的数据

minicom -b 9600 -o -D /dev/ttyUSB0

如果不出意外会出现如下数据树莓派(四):GPS连接并读取
按ctri+a,然后按x就可以退出minicom

3 实时读取数据

运行python

import serial #导入serial模块

ser = serial.Serial("/dev/ttyUSB0",9600)#打开串口,存放到ser中,/dev/ttyUSB0是端口名,9600是波特率

data = []
while True:    
    line = str(str(ser.readline())[2:])#readline()是用于读取整行
    #这里如果从头取的话,就会出现b‘,所以要从第三个字符进行读取
    #print(line)
    if line.startswith('$GNGGA'):
        print('接收的数据:'+str(line))
        line = str(line).split(',')#将line以“,”为分隔符
        
        jing = float(line[4][:-7])+float(line[4][-7:])/60
        #读取第5个字符串信息,从0-2为经度,即经度为116,再加上后面的一串除60将分转化为度
        wei  = float(line[2][:-7])+float(line[2][-7:])/60
        #纬度同理
        data.append(jing)
        data.append(wei)
        #print(data)
        

4 调试中(未完待续)

import math
import serial 
#导入serial模块

#定义起始点和终点函数
def data_gps_start_and_end():
    #打开串口,存放到ser中,/dev/ttyUSB0是端口名,9600是波特率
    ser = serial.Serial("/dev/ttyUSB0",9600)
    while True:
        data = []
        line = str(str(ser.readline())[2:])
        if line.startswith('$GNGGA'):
            print('接收的数据:'+str(line))
            line = str(line).split(',')
            jing = float(line[4][:-7])+float(line[4][-7:])/60
            wei  = float(line[2][:-7])+float(line[2][-7:])/60
            data.append(jing)
            data.append(wei)
            break
        return float(data[0]),float(data[1])
    
#定义读取坐标函数
def data_gps():
    ser = serial.Serial("/dev/ttyUSB0",9600)
    data = []
    line = str(str(ser.readline())[2:])
    if line.startswith('$GNGGA'):
        print('接收的数据:'+str(line))
        line = str(line).split(',')
        jing = float(line[4][:-7])+float(line[4][-7:])/60
        wei  = float(line[2][:-7])+float(line[2][-7:])/60
        data.append(jing)
        data.append(wei)
        return float(data[0]),float(data[1])

#定义点到线距离函数
def getDis(pointX,pointY,lineX1,lineY1,lineX2,lineY2):
    #这里的XY代表要求的点,(x1,y1)(x2,y2)是用来确定直线用的
    a = lineY2-lineY1
    b = lineX2-lineX1
    c = lineX2*lineY1-lineX1*lineY2
    dis = float((a*pointX+b*pointY+c)/(math.pow(a*a+b*b,0.5)))
    #注意:这里没有加绝对值,得出的数有正负之分
    #pow--根号下
    return dis


#确定开始结束点位置
start = input('please input start coordinate::Enter is good')
data_line_start = data_gps_start_and_end()
end = input('please input end coordinate:Enter is good')
data_line_end = data_gps_start_and_end()

data_real_time = []

while True: 
    #这里实时读到gps点位置坐标
    data_real_time.append(data_gps())
    #print(data_real_time)
    weidu = data_real_time[-1]
    jingdu = data_real_time[-2]
    distance_y = getDis(jingdu, weidu, start[0], start[1], end[0], end[1])
    print(distance_y)