time - GPS时间同步

标签 time gps nmea

我正在解析来自设备的 NMEA GPS 数据,该设备发送没有毫秒的时间戳。据我所知,这些设备在发送带有 .000 时间戳的句子时将使用特定的触发点 - 就像 GGA 句子中的 $ 一样。

因此,我正在解析 GGA 语句,并在收到 $ 时获取时间戳(我使用串行端口波特率补偿在同一操作中读取的任何其他字符)。

根据此信息,我计算了用于更正系统时间的偏移量,但是当我将设置的时间与某些 NTP 服务器进行比较时,我会得到 250 毫秒的恒定差异 - 当我手动更正时,我的偏差在 20 毫秒以内,即适合我的应用程序。

但当然,我不确定这个偏移量来自哪里,以及它是否特定于我正在使用的 GPS 鼠标或我的系统。我使用了错误的 $ 字符,还是有人知道应该如何处理?我知道这个问题很模糊,但是任何有关可能导致此偏移的原因的提示都会非常有帮助!

这是我的设备中的一些示例数据,我将使用 $ 字符作为标记的时间偏移量:

$GPGSA,A,3,17,12,22,18,09,30,14,,,,,,2.1,1.5,1.6*31
$GPRMC,003538.000,A,5046.8555,N,00606.2913,E,0.00,22.37,160209,,,A*58
-> $ <- GPGGA,003539.000,5046.8549,N,00606.2922,E,1,07,1.5,249.9,M,47.6,M,,0000*5C
$GPGSA,A,3,17,12,22,18,09,30,14,,,,,,2.1,1.5,1.6*31
$GPGSV,3,1,10,09,77,107,17,12,63,243,30,05,51,249,16,14,26,315,20*7E
$GPGSV,3,2,10,30,24,246,25,17,23,045,22,15,15,170,16,22,14,274,24*7E
$GPGSV,3,3,10,04,08,092,22,18,07,243,22*74
$GPRMC,003539.000,A,5046.8549,N,00606.2922,E,0.00,22.37,160209,,,A*56
-> $ <- GPGGA,003540.000,5046.8536,N,00606.2935,E,1,07,1.5,249.0,M,47.6,M,,0000*55
$GPGSA,A,3,17,12,22,18,09,30,14,,,,,,2.1,1.5,1.6*31
$GPRMC,003540.000,A,5046.8536,N,00606.2935,E,0.00,22.37,160209,,,A*56
-> $ <- GPGGA,003541.000,5046.8521,N,00606.2948,E,1,07,1.5,247.8,M,47.6,M,,0000*5E

最佳答案

您必须考虑 GPS 设备中发生的事情:

  • 接收卫星信号并计算位置、速度和时间。
  • 准备NMEA报文放入串口缓冲区
  • 发送消息

  • GPS 设备的 CPU 速度相对较慢(与现代计算机相比),因此您观察到的这种延迟是设备在生成位置和开始传输数据之间必须进行的处理的结果。

    Here is one analysis 2005 年消费级 GPS 接收器的延迟。您可以在那里找到特定 NMEA 语句的延迟测量。

    关于time - GPS时间同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/551951/

    相关文章:

    optimization - GMSPolyline 非常大的内存峰值

    blackberry - LocationUpdate 方法在 Blackberry 上调用过于频繁

    android - Phonegap Android 和 GPS 卫星

    python - 构建 AIS 消息解码器

    python - While 循环引用时间

    c# - 如何汇总数据库中给定日期的多个时间记录。错误 :Subquery returned more than 1 value

    java - 用Java查找自2004年1月1日UTC 00:00:00以来的TAI秒数

    time - Selenium 中 waitForPageToLoad 的替代方案

    c++ - 如何在我的程序中检测 GPS 设备连接到的端口(C/C)

    java - GPS 服务器连接中使用的最佳协议(protocol)是什么?