我之前用过win7从com口读取GPS数据。从现在开始,我想在Ubuntu下读取数据,但相同的代码不起作用。这是我的代码:
import serial, sys, time, threading
from datetime import datetime, timedelta
class MeasureModule():
def __init__(self, port, baudrate, sync_time=0, sync_nr=0):
self.port = port;
self.baudrate = baudrate;
def start(self):
try:
self.serial = serial.serial_for_url(self.port, self.baudrate, timeout=1)
except AttributeError:
self.serial = serial.Serial(self.port, self.baudrate, timeout=1)
start = time.clock()
while(time.clock()-start<11):
data = self.readline()
print(data)
self.stop();
def stop(self):
self.serial.close()
def readline(self, timeout=1, endline='\n'):
buff='';
try:
tic = time.clock()
ch = self.character(self.serial.read(1))
# you can use if not ('\n' in buff) too if you don't like re
while ((time.clock() - tic) < timeout) and (not ch in endline):
buff += ch
ch = self.character(self.serial.read(1))
except serial.SerialException, e:
return buff
return buff
def character(self,b):
if sys.version_info >= (3, 0):
return b.decode('latin1')
else:
return b
我通过以下方式调用该函数:
for i in range (0,4):
try:
print "Starting measurement /dev/ttyACM%d" % i
gs = GPSModule('/dev/ttyACM%d' % i, 4800, 1, 1)
gs.start()
except:
print "Unable to connect"
run@FXR:/dev$ dmesg | grep tty
[ 0.000000] console [tty0] enabled
[ 4.764464] cdc_acm 2-1.6:1.1: ttyACM0: USB ACM device
[ 4.767620] cdc_acm 2-1.6:1.3: ttyACM1: USB ACM device
[ 4.771525] cdc_acm 2-1.6:1.9: ttyACM2: USB ACM device
[ 4.808622] usb 2-1.4.4: pl2303 converter now attached to ttyUSB0
但我没有收到任何东西。
如何在 Ubuntu 下做同样的事情?如何从 com 端口读取 GPS 数据?
好的!
这段代码非常丑陋和陈旧,我在 2006 年就这样做了,当时我还是一个初学者,而且很天真。
现在迈出小步!
使用命令 dmesg 或检查控制台消息以了解 GPS 连接的是哪个 USB 设备。在我的例子中是 USB0
之后使用此代码
import serial
import socket
ser = serial.Serial('/dev/ttyUSB0', 4800, timeout=1)
latitude = ''
longitude = ''
def readgps(latitude,longitude):
"""Read the GPG LINE using the NMEA standard"""
while True:
line = ser.readline()
if "GPGGA" in line:
latitude = line[18:26] #Yes it is positional info for lattitude
longitude = line[31:39] #do it again
return(latitude,longitude)
print "Finished"
当然你必须调用该函数;)请不要忘记。
记住 GPS 始终在发送数据和通信。
出于教育目的,请执行以下操作: 在 ser.readline() 之后打印行
这样您不仅可以看到整个数据,而不仅仅是纬度和经度坐标。
请记住,USB GPS 只是一个奇特的串行设备;) 这段代码非常简单,我相信您会理解并编写出更好的代码/程序。
您没有用您的程序打开/dev/ttyUSB0。您的 GPS 模块是如何插入的?
如果你这样做会发生什么:
stty -F /dev/ttyACM0 4800
cat /dev/ttyACM0
在控制台中?
您可能需要将自己添加到 GPS 所属的组中。这篇文章发布得很晚,但我最近尝试在 Linux 上配置 USB GPS 冰球,我必须在终端中执行
sudo adduser -aG USERMAME dialout
。这只是将用户添加到 GPS 所在的组(拨出)中。如果您不知道该组,请 cd 到 /dev
(在终端中)并输入 ll (如果不起作用,则输入 ls -Flh)这将显示所有权限和组。有一个专栏特别令人感兴趣;这是最后一栏(我想是倒数第三栏——抱歉,我现在使用的是 Windows),您可能会在列表中看到大约六到七个名为“dialout”的项目。如果你的文件——你的USB——出现在那里,那么这就是该组。否则,只需寻找小组和自己sudo adduser...
。
确保您先注销,然后在重新登录后再次转到终端并输入
cat /dev/ttyACM0
。如果您仍然看不到任何内容,那么您需要配置并告诉它转储其信息的正确速率(波特率);因此,输入(正如其他人提到的)stty -F /dev/ttyACM0 4800
,将波特率配置为 4800。您应该在 google 上搜索正确的波特率,但最后一个命令实质上是说,获取此文件(-F)并以该速率与我交谈( 4800)。
我希望这对某人有帮助,因为我在让我的 USB GPS 圆盘在 linux-mint 上工作时确实遇到了一些麻烦。祝所有 Linux 用户好运(我是最近才皈依的)。 :D
这是我在 Ubuntu 18.04 下使用 Globalsat BU-353N5 USB GPS 设备测试并使用 python 3.6 的一些代码
import serial
ser = serial.Serial('/dev/ttyUSB0',4800,timeout=5)
while 1:
line = ser.readline().decode()
splitline = line.split(',')
if splitline[0] == '$GNGGA':
latitude = line[18:29]
longitude =line[31:42]
print(line)
print('latitude = ',latitude)
print('longitude =',longitude)
print('How to read : 3824.3139 means 38 deg 24.3139 mins')
break