如何在Linux下读取GPS数据?

时间:2012-10-16 08:26:36

标签: python linux gps serial-port

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

3 个答案:

答案 0 :(得分:4)

确定!

这段代码很丑陋而老我在2006年那样做了我是一个初学者而且很天真。

现在宝贝步骤!

  1. 使用命令dmesg或检查控制台消息,以了解哪些USB设备连接了GPS。在我的案例中是USB0

  2. 之后使用此代码


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

答案 1 :(得分:2)

您没有使用您的程序打开/ dev / ttyUSB0。您的GPS模块是如何插入的?

如果您这样做会发生什么:

stty -F /dev/ttyACM0 4800
cat /dev/ttyACM0
在控制台中

答案 2 :(得分:1)

您可能需要将自己添加到gps所在的组中。这是发布的很晚,但我最近尝试在linux上配置一个usb gps冰球,我不得不在终端中进行sudo adduser -aG USERMAME dialout。这只是将用户添加到gps所在的组(拨出)。如果您不了解该组,请cd到/dev(在终端中)并键入ll(如果不起作用,则输入ls -Flh)这将显示所有权限和组。有一栏特别感兴趣;这是最后一列(我觉得倒数第三 - 抱歉,我现在在Windows上),你可能会在列表中看到大约六到七个项目叫做&#34;拨出&#34;。如果您的文件 - 您的USB - 显示在那里,那就是该组。否则,只需自己寻找小组和sudo adduser...

请务必先退出,然后在重新登录后再次转到终端并输入cat /dev/ttyACM0。如果您仍然没有看到任何内容,那么您需要配置并告诉它转储其信息的正确速率(波特率);所以,键入(如其他人提到的)stty -F /dev/ttyACM0 4800,将波特率配置为4800.你应该谷歌正确的波特率,但最后一个命令基本上说,拿这个文件(-F)并告诉我这个率(4800)。

我希望这对某人有所帮助,因为我确实在使用usb gps冰球工作linux-mint时遇到了一些麻烦。祝所有linux用户好运(我最近转换了)。 :d