【问题标题】:get gps time using gpsd/libgps C使用 gpsd/libgps C 获取 gps 时间
【发布时间】:2017-03-15 07:38:15
【问题描述】:

我正在尝试使用 libgps 从 Adafruit 终极 gps 读取数据。我找到了一个代码示例,它提供了我需要的所有信息,除了 gps 时间。如何获取 gps 通过串口发送的 gps 时间,最好以小时/分钟/秒为单位?

我尝试了gps_data.fix.time,但我不确定这是系统时间还是 GPS 时间。

#include <gps.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>

int main() {
    int rc;
    struct timeval tv;

    struct gps_data_t gps_data;
    if ((rc = gps_open("localhost", "2947", &gps_data)) == -1) {
        printf("code: %d, reason: %s\n", rc, gps_errstr(rc));
        return EXIT_FAILURE;
    }
    gps_stream(&gps_data, WATCH_ENABLE | WATCH_JSON, NULL);

    while (1) {
        /* time to wait to receive data */
        if (gps_waiting (&gps_data, 500000)) {
        /* read data */
        if ((rc = gps_read(&gps_data)) == -1) {
            printf("error occured reading gps data. code: %d, reason: %s\n", rc, gps_errstr(rc));
        } else {
            /* Display data from the GPS receiver. */
            if ((gps_data.status == STATUS_FIX) && 
                (gps_data.fix.mode == MODE_2D || gps_data.fix.mode == MODE_3D) &&
                !isnan(gps_data.fix.latitude) && 
                !isnan(gps_data.fix.longitude)) {
                    gettimeofday(&tv, NULL);
                //*****************WOULD LIKE TO PRINT THE TIME HERE.*****************************
                    printf("height: %f, latitude: %f, longitude: %f, speed: %f, timestamp: %f\n", gps_data.fix.altitude, gps_data.fix.latitude, gps_data.fix.longitude, gps_data.fix.speed, gps_data.fix.time/*tv.tv_sec*/);
            } else {
                printf("no GPS data available\n");
            }
        }
    }

    //sleep(1);
}

/* When you are done... */
gps_stream(&gps_data, WATCH_DISABLE, NULL);
gps_close (&gps_data);

return EXIT_SUCCESS;

}

【问题讨论】:

  • 在libgps库管理的$GPGGA消息中,时间值被跳过(看Github source files中的void nmea_parse_gpgga(char *nmea, gpgga_t *loc))。因此,您必须修改该解析函数并更新 loc_t 结构以添加缺少的时间参数。
  • @J.Piquard 与我使用 'sudo apt-get install libgps' 安装的库是同一个库吗?
  • 嗯,在查看 struct gps_data_t 时,我确实看到了 .fix.time 字段。所以,你的 libgps 是更新的,你能提供 Github 源吗?
  • 在检查该帖子libgps C code example 指向的源代码时,struct gps_data_t 似乎有一个字段timestamp_t online;,它是 Unix 时间(以秒为单位,带小数部分)从 GPS 接收器收集。

标签: c linux gps serial-port gpsd


【解决方案1】:

我在 libgps 中跟踪了一些代码,gps_data.fix.time 似乎是 struct timespec 类型的变量。其定义如下:

struct timespec
    time_t  tv_sec;
    long    tv_nsec;    
};

您可能想尝试打印 gps_data.fix.time.tv_sec 和/或 gps_data.fix.time.tv_nsec

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我阅读了我的 PC 的 gps.h,发现 timesec_t 是两倍。 我尝试如下。

    int my_gps_time; // for cast fix.time(double) to int
    struct tm *ptm; // for date and time
    
    ...
    my_gps_time = gps_data.fix.time;
    ptm = localtime((time_t *)&my_gps_time);
    printf("time: %04d/%02d/%02d,%02d:%02d:%02d\n",\
           ptm->tm_year + 1900, ptm->tm_mon + 1,\
           ptm->tm_mday,ptm->tm_hour, ptm->tm_min, ptm->tm_sec); 
    ...
    

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 2015-11-28
      • 2023-01-16
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多