preload
Guide: Sidnumrering i Word 2007 ASP.NET MVC Framework
Jan 27

I mitt föregående inlägg nämnde jag att kanske göra en liten guide för hur man kan få ut koordinaterna från en GPS till ett .NET-program. Jag tänkte börja här med att lite enkel kod göra ett program som hämtar in koordinaterna. Vad som behövs för att åstadkomma detta, är att först och främst få in rå GPS-data, vilket här kommer göras via en vanlig COM-port. Sedan krävs någon slags parser eller intrepreter för att tolka datan från GPS:en. Jag kommer börja att visa hur man kan göra en enkel parser, för att sedan visa hur man får in en COM-port och kopplar ihop detta.

public class NMEAParser
{
public delegate void CoordinatesEventHandler(string latitude, string longitude);
public event CoordinatesEventHandler CoordinatesRecieved;

public NMEAParser() { }

public void Parse(string sentence)
{
switch (GetWords(sentence)[0])
{
case "$GPRMC":
ParseGPRMC(sentence);
break;
default:
break;
}
}

public void ParseGPRMC(string sentence)
{
string[] words = GetWords(sentence);

if ((words[3] != "") && (words[4] != "")
&& (words[5] != "") && (words[6] != ""))
{
string latitude = words[3] + " " + words[4];
string longitude = words[5] + " " + words[6];

CoordinatesRecieved(latitude, longitude);
}
}

public string[] GetWords(string sentence)
{
return sentence.Split(',');
}

Som jag i tidigare inlägg skrev, så skickar GPS-mottagaren hela tiden ut NMEA-meningar som innehåller information som den hämtar från satelliterna. En mening kan se ut enligt följande:

$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62

Vid parsningen, delas meningen upp i en stringarray, där man skiljer av alla värden med kommatecken. Sen är det bara att hämta ut de orden som behövs. För att t ex läsa ut latituden, behöver man det fjärde och femte ordet, och sjätte och sjunde för longituden, vilket man ser i metoden ParseGPRMC i koden ovan. I klassen finns även ett event, CoordinatesRecieved, som avfyras varje gång GPS:en skickat ut koordinater.

För att sedan koppla upp sig mot en GPS krävs en instans av klassen SerialPort, som man först måste importera via följande namespace:

using System.IO.Ports;

SerialPort har ett event som heter DataRecieved. Via detta event får man reda på när porten får data skickad från GPS-enheten. Detta event vill vi koppla till en metod som använder portens ReadLine()-metod varje gång data tas emot. ReadLine() returnerar den strängen som porten har mottagit från GPS-enheten, och denna skickar vi sedan in i vår metod Parse(string sentence).

SerialPort port = new SerialPort("COM3");
NMEAParser parser = new NMEAParser();

public NMEAForm() {
parser.CoordinatesRecieved +=
new NMEAParser.CoordinatesEventHandler(parser_CoordinatesRecieved);
port.DataReceived +=
new SerialDataReceivedEventHandler(port_DataReceived);
port.Open();
}

Våra två metoder som körs när CoordinatesRecieved och DataRecieved avfyras kan se ut såhär:

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
parser.Parse(port.ReadLine());
}

private void parser_CoordinatesRecieved(string latitude, string longitude)
{
textBoxLatitude.Text = latitude;
textBoxLongitude.Text = longitude;
}

Detta är ett väldigt enkelt exempel på hur man kan gå tillväga. $GPRMC-meningen är en utav få, och för att få ut annan information kan en annan mening behöva läsas ut från GPS-enheten.

Mer läsning om de olika NMEA-meningarna och vad de innehåller för information finns på denna sidan.

Jag hoppas att denna lilla guiden går att förstå och är någorlunda vettig. Kommentera gärna om ni har tips på förbättring av inlägget eller om ni helt enkelt har några frågor.

3 Responses to “Guide: Att få ut koordinaterna från en GPS”

  1. Jocke Says:

    Det var ett mycket bra exempel tycker jag! Enkelt att förstå vad som händer och så! Nu ska jag gå iväg med mina rymdvänner och sjunga rymdsången!

  2. Mattias Says:

    Fint exempel! Ser ju förvånansvärt enkelt ut. Tyckte det var intressant hur man kan ta emot data från datorns COM portar på ett så enkelt sätt. Kan detta användas för att ta emot data från t.ex. mobiltelefoner eller digitalkameror?

    Aboooooooo

  3. Martin Thern Says:

    Kul att ni gillade mitt lilla exempel. Nästa steg vore kanske att även lyfta in WPF med .NET 3.5 för att göra ett skitcoolt GUI till nåt roligt GPS-program. Hehe.

    Vet inte hur det funkar med att ta emot data från andra grejer. Om du syftar på filöverföring eller liknande med mobiltelefon så är det säkert något mer avancerat.

Leave a Reply