タイムスタンプをミリ秒単位で送信するデバイスから 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