我是使用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;
}
谢谢, 费利佩
答案 0 :(得分:1)
来自gpsd documents(重点是我)
如果没有新数据,
gps_waiting()
可用于检查守护程序中是否有新数据。 第二个参数是返回之前等待输入的最长时间(以微秒为单位)。如果存在输入等待,则返回true,如果超时(无数据等待)或错误情况,则返回false。使用套接字导出时,此函数是对select(2)调用的方便包装...
gps_waiting(&gps_data, t)
将阻塞 t
微秒。从GPS接收到新数据后,gps_waiting
应该立即返回。如果没有收到新数据,该函数将超时并在t
微秒后返回。
获得更快的数据速率将取决于GPS输出数据的速度。仅减小gps_waiting
的第二个参数将给您带来更快的数据速率的错觉,但是如果您检查该函数的返回值,您会发现所做的所有操作会使该函数更快地超时。 / p>