如何在Linux下读取GPS数据?

mwyxok5s  于 11个月前  发布在  Linux
关注(0)|答案(4)|浏览(140)

我以前用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数据?

ruarlubt

ruarlubt1#

好了,好了
这段代码是非常丑陋和旧的,我在2006年做了,我是一个初学者和天真。
现在婴儿的步骤!
1.使用命令dmesg或检查您的控制台消息,以了解哪个USB设备连接您的GPS。在我的情况下是USB 0
1.在此之后,使用此代码

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只是一个花哨的串行设备;)这段代码非常简单,我相信你会理解并做出更好的代码/程序。

kyks70gy

kyks70gy2#

你没有用你的程序打开/dev/ttyUSB 0。你的GPS模块是如何插入的?
如果你这样做会发生什么:

stty -F /dev/ttyACM0 4800
cat /dev/ttyACM0

字符串
在一个控制台?

3df52oht

3df52oht3#

你可能需要将自己添加到gps所在的组中。这是很晚才发布的,但我最近试图在Linux上配置一个usb gps冰球,我不得不在终端中做sudo adduser -aG USERMAME dialout。这只是将用户添加到gps所在的组(拨号)。如果你不知道该组,cd到/dev(在终端)和类型II(如果不起作用,可以使用ls -Flh)这将显示所有权限和组。这是最后一列(我认为倒数第三个--对不起,我现在在Windows上),你可能会在列表中看到大约六到七个名为“拨号”的项目。如果你的文件--你的usb --显示在那里,那么就是组了,否则,自己找组和sudo adduser...就行了。
确保先注销,然后--重新登录后--再次进入终端并键入cat /dev/ttyACM0。如果仍然什么也看不到,则需要配置并告诉它转储信息的正确速率(波特率);所以,类型(正如其他人提到的)stty -F /dev/ttyACM0 4800,它将波特率配置为4800。你应该谷歌正确的波特率,但最后一个命令本质上说,拿着这个文件(-F),以这个速度(4800)和我说话。
我希望这能帮助到一些人,因为我确实在让我的usb gps冰球在linux-mint上工作时遇到了一些麻烦。祝所有的linux用户好运(我是最近的转换者)。:D

yiytaume

yiytaume4#

这里有一些代码,我已经测试过,并肯定在Ubuntu 18.04下与Globalsat BU-353 N5 USB GPS设备,使用Python 3.6
在运行python代码之前,在Linux上运行lsusb以确认它可以看到GPS单元。
我在我的Linux PC上运行了这个,并把USB接收器放在窗台上,它似乎工作得很好。
注意添加的“.decode()”-这可以避免有时可能出现的潜在字符串错误“type object 'str' has no attribute”。
我在澳大利亚的GPS输出似乎输出GNGGA,我已经看到GPGGA输出在美国上市,你将需要适应下面的代码是什么GPS单元吐出来。

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[30:42]
        print(line)
        print('latitude = ',latitude)
        print('longitude =',longitude)
        print('How to read : 3824.3139  means 38 deg 24.3139 mins')
       break

字符串

相关问题