【发布时间】: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