(NMEA 0183) Checksum Calculator

Ez itt egy primitív számológép, amely a GPS lapkád NMEA mondatait ellenőrzi soronként.

Beírod a kezdő $ és a mondatvégi * nélkül az adatokat, melyek ún. mezőelválasztó karaktere a vessző (,). Végül nyomsz egy entert és a következő sorban megjelenik a teljes mondat, a sor végén a checksum adattal. Ha ez egyezik azzal a számmal, ami az eredeti mondat végén is van (amelyet a GPS antennád adott), az ellenőrző összeg helyes, nem kell interferenciára vagy egyéb működési zavarokra gondolnod.

A használathoz böngésződnek JavaScriptre van szüksége, valószínűleg alapértelmezetten ez be van állítva. Az alábbiakban előre beírtam egy rövidebb példamondatot, mely alatt ott a kiértékelés is.

Ellenőrizendő NMEA mondatod:
$*
Checksum:

A NMEA egy mozaikszó, amely a National Marine Electronics Association nevéhez fűződik. Ez a szervezet fejlesztette ugyanis azt az interface-t, amely segítségével a használt eszközök egymással, illetve különböző számítógépekkel egységes formátumú üzenetek alapján képesek kommunikálni. Az NMEA üzenetek alapja az, hogy a vevő olyan mondatokban kommunikál, amelyek teljesen sajátságosak és függetlenek egymástól. 

A mondatok egy része szabványos formátum, minden egyes vevő által ismert, lehetőség van azonban egyedi konfigurációval rendelkező üzenetek definiálására is. Minden mondat elején szerepel 2 karakter, amely az üzenetet továbbító berendezés jellemzője, ez a GPS vevők esetén a "GP" karakter-kombináció.
Az egyedileg meghatározott sorok az eszköz gyártójára vonatkozó információt tartalmaznak, ezek első karaktere "P" és a következő 3 karakter utal az eszközt gyártó cégre (pl. PMGN - Magellan). Minden egyes mondat kezdő karaktere a '$' és utolsó karaktere az un. CR/LF (Carriage Return/ Line Feed), és a sorok maximális hossza nem haladhatja meg a 80 karaktert a befejező karakter (line terminator) nélkül. Az egy sorban levő különböző üzenetek elválasztására a ’,’ karakter szolgál. Minden mondat végét egy un. ’checksum’ karakter zárja le, amelyet a fogadó egység nem feltétlenül vizsgál, viszont megléte fontos információ az adatok jóságára vonatkozóan. Az NMEA üzenetek minden serial port esetében az RS232 protokollt használva elérhetőek bármely számítógép számára.
Az adattovábbítás sebessége általában 4800 b/s (bit per second rate), de egyes vevők esetében beállítható a 9600 b/s érték is. Az alapérték azt jelenti, hogy a vevő 480 karaktert képes elküldeni egy másodperc alatt, ami tulajdonképpen 6 mondatnak felel meg. A mondatokat felépítő adatok 8 Bitesek, egyezés (parity) nem értelmezett és egyetlen un. ’StopBit’ karakter található bennük.
Az NMEA mondatok felépítése szabványos, minden egyes mondat egy sort jelent és egyedi azonosítóval rendelkezik. A küldött üzenetek függenek a vevő gyártójától, azonban ezek a szabványos üzenetek kiegészítéseként jelentkeznek az egyes típusoknál.
--------------
Mikor van minderre szükséged? Ha olyasmire vetemedsz, hogy saját GPS rendszert építesz valaminek vezérlésére és eldobod az agyadat, forrasztópákád mellett egy balta is van, programozásaidat meg úgy végzed, hogy néha még az antennát is a falhoz vágod, mert olyan anomáliák érnek, melyeket epszilon sugarú környezetedben még senki sem tapasztalt, a chiped meg olyan új, hogy igazán még a szakmai fórumok sem jöttek létre, ahol a megoldásokat szelíden, kávét vagy teát kortyolgatva végigolvashatók.
Aki eléggé elmebeteg, hogy UNIX rendszerekben Perl-ben dolgozva ellenőrizze az NMEA-kimeneteket, annak javaslom ezt a kis scriptet a reggeli kávé helyett. Az ellenőrző összeg egy 2 számjegyű hexadecimális érték, melyet a mondat egyes karaktereinek ASCII értékét XOR-olva kapunk, kivéve a nyitó $ jelet és a sorvégi *-ot, mely mely utóbbi magát az ellenőrző összeget előzi meg.

<!-- You can place html anywhere within the source tags -->



#!/usr/bin/perl -w
#
# gpscksum.pl
# Az egyes NMEA mondatok ellenőrzése
###################################
use strict;
my $count=1;
while (&lt;&gt;)
{
my ($string, $cksum);
if (/^\$(.*)\*([0-9A-Fa-f][0-9A-Fa-f])/)
{
$string = $1; # (minden, ami a nyitó $ és az ellenőrző összeg közé esik)
$cksum = $2; # (Az NMEA mondat hexadecimális ellenőrző összege)
} else
{
die "Hibás formátumú NMEA 0183 mondat: $_\n";
}
# Az ellenőrző összeg kiszámítása:
my $my_cksum;
for (my $i = 0; $i &lt; length ($string); $i++)
{
$my_cksum ^= ord(substr($string, $i, 1))
}
# Az ellenőrző összegek összehasonlítása
if ($my_cksum != hex($cksum))
{
print "A $count sor ellenőrző összege nem egyezik: ",
$my_cksum, "!=", hex($cksum), "\n";
}
$count++;
}


Ugyanez javascripttel:

<!-- You can place html anywhere within the source tags -->


<script language="javascript" type="text/javascript">
// You can place JavaScript like this

<!--

// Compute the MTK checksum and display it
function updateChecksum(cmd)
{
// Compute the checksum by XORing all the character values in the string.
var checksum = 0;
for(var i = 0; i < cmd.length; i++) {
checksum = checksum ^ cmd.charCodeAt(i);
}

// Convert it to hexadecimal (base-16, upper case, most significant nybble first).
var hexsum = Number(checksum).toString(16).toUpperCase();
if (hexsum.length < 2) {
hexsum = ("00" + hexsum).slice(-2);
}

// Display the result
settext(document.getElementById("output"), "$" + cmd + "*" + hexsum);
}

// Helper function to set the contents of the SPAN to some text
function settext(span, text)
{
if (!span.hasChildNodes()) {
span.appendChild(span.ownerDocument.createTextNode(text));
return;
} else {
span.firstChild.nodeValue = text;
}
}

-->

</script>


Primusz Péter nyomán, kiértékelővel és forráskóddal bővítve.

Hozzászólások:

Helyszínekkel kapcsolatos írások

contentmap_module