从gpsd检索数据而无需等待时间

时间:2018-08-27 15:00:38

标签: c gpsd

我是使用C的gpsd的新手。我实现了使用gps_stream函数的第一个客户端。如果我理解正确,它就像一个pub / sub函数,您可以使用gps_read读取gps数据。我想尽快获取数据。我发现的唯一方法是减少gps_waiting函数的时间。我想知道是否有一种方法不使用gps_waiting函数并尽快检索。这是我的代码。

int runGpsStreamClient() {
    int rc;
    int count = 0;
    clock_t t;

    struct gps_data_t gps_data;
    t = clock();
    if ((rc = gps_open("localhost", "2947", &gps_data)) == -1) {
        printf("code: %d, reason: %s\n", rc, gps_errstr(rc));
        return EXIT_FAILURE;
    }
    get_metric(t, "gps_open");

    t = clock();
    gps_stream(&gps_data, WATCH_ENABLE | WATCH_JSON, NULL);
    get_metric(t, "gps_stream");

    while (count < 60) {
        /* wait for 0.1 second to receive data */
        if (gps_waiting(&gps_data, 100000)) {

            t = clock();
            int rc = gps_read(&gps_data);
            get_metric(t, "gps_read");

            /* read data */
            if (rc == -1) {
                printf("error occurred reading gps data. code: %d, reason: %s\n", rc, gps_errstr(rc));
            } else {
                /* Display data from the GPS receiver. */
                double lat = gps_data.fix.latitude;
                double lon = gps_data.fix.longitude;
                double alt = gps_data.fix.altitude;
                double speed = gps_data.fix.speed;
                double climb = gps_data.fix.climb;
                time_t seconds = (time_t) gps_data.fix.time;
                int status = gps_data.status;
                int mode = gps_data.fix.mode;

                printf("status[%d], ", status);
                printf("mode[%d], ", mode);
                printf("latitude[%f], ", lat);
                printf("longitude[%f], ", lon);
                printf("altitude[%f], ", alt);
                printf("speed[%f], ", speed);
                printf("v speed[%f], ", climb);
                printf("Time[%s].", ctime(&seconds));

                if ((status == STATUS_FIX)
                        && (mode == MODE_2D || mode == MODE_3D)
                        && !isnan(lat) && !isnan(lon)) {
                    printf(" GPS data OK.\n");
                } else {
                    printf(" GPS data NOK.\n");
                }
            }
        } else {
            printf("counter[%d]. Timeout to retrieve data from gpsd. Maybe increase gps_waiting.\n", count);
        }
        count++;
    }
    /* When you are done... */
    gps_stream(&gps_data, WATCH_DISABLE, NULL);
    gps_close(&gps_data);

    return EXIT_SUCCESS;
}

谢谢, 费利佩

1 个答案:

答案 0 :(得分:1)

来自gpsd documents(重点是我)

  

gps_waiting()可用于检查守护程序中是否有新数据。 第二个参数是返回之前等待输入的最长时间(以微秒为单位)。如果存在输入等待,则返回true,如果超时(无数据等待)或错误情况,则返回false。使用套接字导出时,此函数是对select(2)调用的方便包装...

如果没有新数据,

gps_waiting(&gps_data, t)将阻塞 t微秒。从GPS接收到新数据后,gps_waiting应该立即返回。如果没有收到新数据,该函数将超时并在t微秒后返回。

获得更快的数据速率将取决于GPS输出数据的速度。仅减小gps_waiting的第二个参数将给您带来更快的数据速率的错觉,但是如果您检查该函数的返回值,您会发现所做的所有操作会使该函数更快地超时。 / p>