0 准备
从左到右分别是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
如果不出意外会出现如下数据
按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)