因此,我尝试在 Ubuntu 14.04 上运行 gpsd,使用通过 TCP 传入的 NMEA 馈送和 RS-232 馈送的 DCD 线路上的 PPS 信号。我使用的 GPS 也可以选择使用 RS-232,但在这种情况下我们需要通过 TCP 进行。
通过串行启动带有 NMEA 和 PPS 的 gpsd 工作正常。我使用类似以下内容的东西:
sudo gpsd -n /dev/ttyCTI1 /dev/pps0
然后启动 gpsmon,我看到 NMEA 字符串和 PPS 线都出现了。
当我使用以下命令启动 gpsd 时:
sudo gpsd -n tcp://192.168.43.172:10001 /dev/pps0
我只看到 NMEA 字符串。
在 /dev/pps0 上执行 ppstest 并在 /dev/ttyCTI1 上执行 ppscheck 会产生预期的输出。
知道哪里出了问题吗?请注意,我使用的是从源代码构建的 gpsd 3.18。
答案1
dirkt 是正确的。答案就在 gpsd 源代码中。查看ntpshm_link_activate
中timehint.c
第 458 行的方法:
/* don't talk to NTP when we're:
* reading from a file
* reading from a pipe
* reading from a remote gpsd
* running inside the test harness (PTY)
* over TCP or UDP
*/
if (SOURCE_BLOCKDEV == session->sourcetype ||
SOURCE_GPSD == session->sourcetype ||
SOURCE_PIPE == session->sourcetype ||
SOURCE_PTY == session->sourcetype ||
SOURCE_TCP == session->sourcetype ||
SOURCE_UDP == session->sourcetype) {
return;
}
来源:https://fossies.org/dox/gpsd-3.24/timehint_8c_source.html#l00449
这可能只是决定不与 NTP 通信的兔子洞的开始gpsd
,但我将留给比我更熟悉的用户来搜索源代码。无论如何,这里的评论非常明确。我只能假设,就像 Dirkt 所做的那样,他们这样做是因为非串行传输中的延迟可能高得多 - 这可能会导致通过连接的 1PPS 信号通过 TCP 发送的 NMEA 消息不一致。也许您可以简单地在源代码中修补此方法,gpsd
以允许即使在 TCP 上也可以进行 NTP 通信,但我不能保证这样做会带来任何好处。
我遇到了同样的情况,花了很长时间才弄清楚。希望这能对以后的人有所帮助。