GPSログの手動checksum再計算

執筆:2012.05.05


通常のchecksumは、全部の合計ですが計算方法が違います。
$と*の間の文字を順番にxor演算します。

修正したいポイントの緯度経度は、
google earthでカーソル位置の情報をリアルタイムで知ることができるのでそれを参考にすると簡単です。

GPSログの緯度経度を手動で修正した場合の再計算などに使うと便利です。
機器にGPSログの修正機能が付属していない場合に
  ちょっとここ微妙に違う!!
   このわずかな ずれが気になる!!
 というようなときに活躍します。

コード(Pascal言語)

// GPSのログの行を手動変更した場合のchecksumの再計算など
function GPS_NMEA_Line_Checksum(s : string) : integer;
  var
   i , sum : integer;
begin
  // $data*<CR><LF>
  // $と*の間の文字をxorします
  // Todo : 1文字目が $以外は例外生成
  sum := 0;
  s := Trim(s);
  for i := 1 to Length(s) do
   begin
     if (i = 1) and (s[1] = '$') then continue;
     if (s[i] = '*') then break;
      sum := sum xor  Byte(s[i]);
   end;
   Result := sum;
end;

procedure TForm1.Button_RecalcClick(Sender: TObject);
begin
  Edit2.text := Format('%.2x' , [ GPS_NMEA_Line_Checksum(Edit1.text)]);
end;

procedure TForm1.Button_ClearClick(Sender: TObject);
begin
  Edit1.text := '';
end;


C/C++言語の場合は、 xor は ^ です。
for ( i = 0; i < strlen(s); i++ )
 {
     if ( (i == 0) && (s[0] == '$') )
        { continue; }
     if (s[i] == '*')
        { break; }
      sum = sum ^ s[i];
  }

GPSの各行の仕様は、
  GPS NMEA フォーマット
  GPS NMEA 仕様
などで検索すると知ることができます。

finepixだと 1ポイントは、4行が1セットです。
$GPGGA,・・・
$GPGSA,・・・
$GPRMC,・・・
$GPVTG,・・・