来自覆盆子pi的adafruit终极gps的配置不起作用

时间:2015-07-19 16:29:23

标签: gps raspberry-pi raspbian raspberry-pi2

我使用USB转TTL串口线将我的终极gps突破连接到我的树莓派。使用C代码,我可以轻松连接到GPS并从中读取NMEA语句。但是当我编写PMTK220等配置命令来设置更新速率时,它们会被忽略。我应该回到PMTK_ACK报告成功或失败,但它没有即将到来。当我使用终端窗口时也会出现问题。即。我跑:

while (true) do cat -A /dev/ttyUSB0 ; done

在一个终端中,获取$GPGGA$GPGSA$GPRMC等消息流。在另一个终端我运行:

echo "$PMTK220,200*2C\r\n" > /dev/ttyUSB0

NMEA消息继续,但没有PMTK001回来。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好的,这里有一些代码(受gpsd源启发),它演示了发送配置消息并获得确认:

#define _BSD_SOURCE
#include <stdio.h>    
#include <stdarg.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <fcntl.h>
#include <unistd.h>
#include <assert.h>
#include <semaphore.h>
#include <string.h>

#ifndef CRTSCTS
#  ifdef CNEW_RTSCTS
#    define CRTSCTS CNEW_RTSCTS
#  else
#    define CRTSCTS 0
#  endif /* CNEW_RTSCTS */
#endif /* !CRTSCTS */

int main (int argc, char **argv) {
    int const baudr = B9600, mode = O_RDWR | O_NONBLOCK | O_NOCTTY;
    int const fd = open("/dev/ttyUSB0", mode);
    assert (fd != -1);
    ioctl(fd, (unsigned long)TIOCEXCL);
    struct termios ttyOld, ttyNew;
    assert(tcgetattr(fd, &ttyOld) != -1);
    ttyNew = ttyOld;
    ttyNew.c_cflag &= ~(CSIZE | PARENB | PARODD | CRTSCTS | CSTOPB);
    ttyNew.c_cflag |= CREAD | CLOCAL | CS8;
    ttyNew.c_iflag = ttyNew.c_oflag = 0;
    ttyNew.c_lflag = ICANON;
    cfsetispeed(&ttyNew, baudr);
    cfsetospeed(&ttyNew, baudr);
    assert(tcsetattr(fd, TCSANOW, &ttyNew) != -1);
    tcflush(fd, TCIOFLUSH);
    usleep(200000);
    tcflush(fd, TCIOFLUSH);
    int const oldfl = fcntl(fd, F_GETFL);
    assert (oldfl != -1);
    fcntl(fd, F_SETFL, oldfl & ~O_NONBLOCK);
    tcdrain(fd);
    printf("port opened baudr=%d mode=%d i=%d o=%d c=%d l=%d fl=%d\n", baudr, mode, ttyNew.c_iflag, ttyNew.c_oflag, ttyNew.c_cflag, ttyNew.c_lflag, oldfl);
    unsigned char buf[2048];
    int count = 0;
    while(++count < 20) {
        if (count == 4) {
            char const *const cmd = "$PMTK220,200*2C\r\n";
            int const n = strlen(cmd);
            assert(write(fd, cmd, n) == n);
            tcdrain(fd);
            printf("wrote command %d: %s\n", n, cmd);
        }
        int const n = read(fd, buf, sizeof(buf));       
        buf[(n >= sizeof(buf)) ? (sizeof(buf) - 1) : n] = 0;
        printf(buf);
    }
    tcsetattr(fd, TCSANOW, &ttyOld);
    close(fd);
}

结果:

pi@pi01 ~/c $ ./test
port opened baudr=13 mode=2306 i=0 o=0 c=3261 l=2 fl=2050
$GPGGA,175748.089,,,,,0,00,,,M,,M,,*71
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,175748.089,V,,,,,0.00,0.00,260715,,,N*43
wrote command 17: $PMTK220,200*2C

$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$PMTK001,220,2*31
$GPGGA,175749.089,,,,,0,00,,,M,,M,,*70
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,01,11,,,31*7A
$GPRMC,175749.089,V,,,,,0.00,0.00,260715,,,N*42
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$GPGGA,175750.089,,,,,0,00,,,M,,M,,*78
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,175750.089,V,,,,,0.00,0.00,260715,,,N*4A
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$GPGGA,175751.089,,,,,0,00,,,M,,M,,*79
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,175751.089,V,,,,,0.00,0.00,260715,,,N*4B
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$GPGGA,175752.089,,,,,0,00,,,M,,M,,*7A
pi@pi01 ~/c $