Halloj! GPS:en använder troligen NMEA-0183. Skickar ut en sträng innehållande olika sorters GPS Sentence. Googla på NMEA 0183 så får du se vilken Sentence som passar dig. Allt kommer i en långt textsträng med smidiga identifierare så det är bara att parsa ut just det du vill ha. Om det bara är long och lat du vill ha kan du ta nästan vilken Sentence som helst. Japp, det är NMEA-0183 den skickar ut (enl spec iaf). Men hur läser jag det från COM-porten? Jag har ett SerialPort objekt och har ställt den på rätt COM och har försökt med diverse metoder för att läsa. Du verkar ju helt klart vara på rätt väg. Hmm. Jag hittade en applikation på devx.com som gjorde vad jag ville. Tankade hem koden, modifierade den (vill inte skicka data till servern nu utan bara skriva ut Lat o Long i PDA:n). Men den verkar inte hitta något. Den verkar öppna porten och aktivera GPS:en (vilket märks på lite lampor som blinkar i olika mönster och färger) och om jag öppnar TomTom mitt i det hela så märks det DIREKT att den har fix på satelliter eftersom TomTom DIREKT visar korrekt position och hänger med i rörelser. Hejsan Nej. Jag kör inte TomTom och min applikation samtidigt. Jag kör en åt gången. Men om TomTom får synk inom ~30 sekunder och min applikation inte får det alls, då känns det som att något är fel. Den verkar som sagt inte trigga eller avsluta DataReceived eventet. Okay Johannes, Gärna.. Ska bli mycket intressant att se. :) lägg gärna upp det här på pellesoft, jag har ocksåe en 3300 som jag tänkte skriva en liten app till. Hej igen tack. Hej Patrik Det tar längre tid att få synk, men annars så är det inga problem. Sen att den inte får kontakt med samtliga sateliter är väl inte så konstigt. Halloj. Nu har jag kommit en bit på att översätta från C# till VB.NET Något i stil med... Det funkade ändå. Aha. Tack. :) Nu är jag ALLDELES för trött igen.Kommunicera med GPS-enheten på mobiltfn.
Jag har en HTC P3300 (Artemis) med inbyggd GPS och Windows Mobile 5.0.
GPS:en är inställd på COM4 och funkar som den ska. Tänkte nu göra en liten snurra som tar ut GPS-koordinaterna med jämna mellanrum (typ 20 sek) och sänder dem till en server.
Skickandet till servern är inga konstigheter, men hur sjutton gör man för att hämta ut koordinaterna från GPS:en??
Någon som kan peka mig i rätt riktning så vore det riktigt uppskattat.
//JohannesSv: Kommunicera med GPS-enheten på mobiltfn.
Sv:Kommunicera med GPS-enheten på mobiltfn.
Men jag får enbart diverse fel. Allt från att objektet inte stöder Latebinding till helt enkelt bara Exception utan närmare beskrivning.Sv: Kommunicera med GPS-enheten på mobiltfn.
Det här har jag använt mig utav att utgå ifrån för liknande saker:
http://blogs.msdn.com/coding4fun/archive/2006/10/31/912287.aspx
Kanske hittar du någon detalj som du missat...annars visa lite kod.Sv:Kommunicera med GPS-enheten på mobiltfn.
Följande kod har jag:
<code>
Public Class Form1
Private WithEvents serialPort As New IO.Ports.SerialPort
Private Sub ConnectGPS(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click
If serialPort.IsOpen Then
serialPort.Close()
End If
Try
With serialPort
.PortName = "COM4"
.BaudRate = 9600
.Parity = IO.Ports.Parity.None
.DataBits = 8
.StopBits = IO.Ports.StopBits.One
End With
serialPort.Open()
MenuItem1.Enabled = False
MenuItem3.Enabled = True
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles serialPort.DataReceived
TextBox1.BeginInvoke(New myDelegate(AddressOf updateTextBox), New Object() {})
End Sub
Public Delegate Sub myDelegate()
Public Sub updateTextBox()
TextBox1.Text += serialPort.ReadExisting()
Dim lines() As String = TextBox1.Text.Split(vbLf)
If lines.Length < 2 Then
Exit Sub
End If
If TextBox1.Text.Length >= 500 Then
TextBox1.Text = TextBox1.Text.Substring(TextBox1.Text.LastIndexOf("$"))
End If
If lines(lines.Length - 2).StartsWith("$GPGGA") Or lines(lines.Length - 2).StartsWith("$GPRMC") Then
processGPSData(lines(lines.Length - 2))
End If
End Sub
Private Sub processGPSData(ByVal str As String)
Dim rawLatLng As Double
Try
Dim field() As String
field = str.Split(",")
Dim lat, lng As Double
Select Case field(0)
Case "$GPGGA"
'---latitude---
rawLatLng = Convert.ToDouble(field(2))
lat = (rawLatLng \ 100) + _
((rawLatLng - ((rawLatLng \ 100) * 100)) / 60)
'---latitude is negative if South---
If field(3) = "S" Then
lat *= -1.0
End If
'---longitude---
rawLatLng = Convert.ToDouble(field(4))
lng = (rawLatLng \ 100) + _
((rawLatLng - ((rawLatLng \ 100) * 100)) / 60)
'---longitude is negative if West---
If field(5) = "W" Then
lng *= -1.0
End If
'---display the lat and lng---
lblLatTitle.Text = lat
lblLng.Text = lng
'---synchronize with the server---
'sync.PerformSync(ServerIP, ID & ":" & lat & ":" & lng)
Case "$GPRMC"
'---display the speed---
If field(7) = String.Empty Then
lblSpeed.Text = "0 km/h"
Else
lblSpeed.Text = (Convert.ToDouble(field(7)) * 1.85).ToString & " km/h"
End If
End Select
Catch
MsgBox("Ett fel har uppstått")
End Try
End Sub
Private Sub DisconnectGPS(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem3.Click
serialPort.Close()
MenuItem1.Enabled = True
MenuItem3.Enabled = False
End Sub
End Class
</code>
Det känns som att den connectar mot GPS:en som sagt men att inget triggar igång DataReceived.
Vad sjutton ska man göra? Är helt vilse i pannkakan här.
//JohannesSv: Kommunicera med GPS-enheten på mobiltfn.
Jag sitter med samma programförsök som du och kan läsa NMEA-strängarna utan problem, dock funkar inte vidaresändningen till servern för mig. Jobbar vidare och hör av mig igen.
En fråga bara: Du säger att TomTom läser GPS.data utan problem men att din applikation inte gör det. Du kan inte ha två applikationer igång samtidigt som läser porten. Den som läser först rensar porten, vilket kan vara en förklaring till att din app inte hittar något.
Dessutom: Har du Nationella inställningar för Sverige så kommer decimapunkt/decimalkomma att ställa till det för dig.
mvh
ChristerSv:Kommunicera med GPS-enheten på mobiltfn.
Läste något om det innan att det inte går att köra det eftersom det är en konstant ström av data, samtidigt som jag hittade lite info om att det finns något som heter GPS_POSITION i WM5 SDK:n.
Ska kolla närmare på det och återkommer jag med.
Om någon har en lösning på problemet så tveka inte att säga till.
//JohannesSv: Kommunicera med GPS-enheten på mobiltfn.
helt plötsligt och utan föregående varning började mitt program funka.
Jag skall plocka bort en massa onödigt test-krafs och sen skicka koden till dig i morgon.Sv:Kommunicera med GPS-enheten på mobiltfn.
//JohannesSv:Kommunicera med GPS-enheten på mobiltfn.
Sv: Kommunicera med GPS-enheten på mobiltfn.
Applikationen består av Form1.vb och Sync.vb
Här finns bara koden för PDA, alltså ingenting för Servern.
Hoppas detta hjälper dig.
Koden för Form1
Public Class Form1
'************************************************************
'Denna kod är till mycket stor del baserad på koden från Wei-Meng Lee's artikel
'Take Your Apps Far and Wide with a GPS Tracking System
'på http://www.devx.com/wireless/Article/32938/0
'
'Jag kunde inte få koden att fungera rakt av, men kom fram till att ett problem
'är att handdatorer med svensk nationell inställning får problem med koder såsom
'rawLatLng = Convert.ToDouble(field(2))
'För att råda bot för detta gör jag ett byte av decimalpunkt mot decimalkomma
'varvid jag i denna kod använder strängvariabeln LocSep som innehåller det
'tecken som används. (Se Form1_Load)
'************************************************************
Public LocSep As String
'---serial port to connect to the GPS receiver---
Private WithEvents serialPort As New IO.Ports.SerialPort
'---IP address of the server---
Private ServerIP As String = "10.0.1.4" 'Byt ut mot din egen IP-adress
'---the ID of the user---
Private ID As String = "1"
'---use for synchronization---
Dim sync As New Sync
'---Connect GPS---
Private Sub MenuItem1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MenuItem1.Click
'---close the port if it is already open---
If serialPort.IsOpen Then
serialPort.Close()
End If
'---set the parameters and open the port---
Try
With serialPort
.PortName = "COM6"
.BaudRate = 9600
.Parity = IO.Ports.Parity.None
.DataBits = 8
.StopBits = IO.Ports.StopBits.One
End With
serialPort.Open()
'---disable the Connect GPS menu item---
MenuItem1.Enabled = False
'---enable the Disconnect menu item---
MenuItem3.Enabled = True
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
Private Sub DataReceived( _
ByVal sender As Object, _
ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
Handles serialPort.DataReceived
TextBox1.BeginInvoke(New _
myDelegate(AddressOf updateTextBox), _
New Object() {})
End Sub
Public Delegate Sub myDelegate()
Public Sub updateTextBox()
TextBox1.Text += serialPort.ReadExisting()
Dim lines() As String = TextBox1.Text.Split(vbLf)
If lines.Length < 2 Then
Exit Sub
End If
If TextBox1.Text.Length >= 1000 Then
'---clear until the last $---
TextBox1.Text = TextBox1.Text.Substring(TextBox1.Text.LastIndexOf("$"))
End If
If lines(lines.Length - 2).StartsWith("$GPGGA") Or _
lines(lines.Length - 2).StartsWith("$GPRMC") Then
processGPSData(lines(lines.Length - 2))
End If
End Sub
Private Sub processGPSData(ByVal str As String)
Dim rawLatLng As Double
Try
'---separate the GPS data into various fields---
Dim field() As String
field = str.Split(",")
Dim lat, lng As Double
Select Case field(0)
Case "$GPGGA"
If Convert.ToDouble(field(6)) = 1 Then
'---latitude---
'*************************************************************
'Här sker utbytet av punkt till nationellt decimaltecken
'*************************************************************
field(2) = Replace(field(2), ".", LocSep)
rawLatLng = field(2)
'*************************************************************
'NMEA-strängen ger en latitud i formatet 5910.1234
'vilket skall utläsas som 59 grader och 10.1234 bågminuter
'vilket i sin tur omräknas till grader och decimaler av grader enligt
'nedanstående formel.
'*************************************************************
lat = (rawLatLng \ 100) + _
((rawLatLng - ((rawLatLng \ 100) * 100)) / 60)
'---latitude is negative if South---
If field(3) = "S" Then
lat *= -1.0
End If
'**************************************************************
'Samma sak här fast NMEA-strängen innehåller ett tecken mer till vänster om
'decimaltecknet (longituden omfattar ju +180 till -180 grader medan latituden
'ju omfattar +90 till -90.
'**************************************************************
'---longitude---
'*************************************************************
'Här sker utbytet av punkt till nationellt decimaltecken
'*************************************************************
field(4) = Replace(field(4), ".", LocSep)
rawLatLng = field(4)
lng = (rawLatLng \ 100) + _
((rawLatLng - ((rawLatLng \ 100) * 100)) / 60)
'---longitude is negative if West---
If field(5) = "W" Then
lng *= -1.0
End If
'---display the lat and lng---
lblLat.Text = "Lat:" & lat
lblLng.Text = "Lng:" & lng
'---synchronize with the server---
sync.PerformSync(ServerIP, ID & ":" & lat & ":" & lng)
End If
Case "$GPRMC"
If field(2) = "A" Then
'---display the speed---
If field(7) = String.Empty Then
lblSpeed.Text = "Speed: 0 km/h"
Else
'*************************************************************
'Här sker utbytet av punkt till nationellt decimaltecken
'*************************************************************
field(7) = Replace(field(7), ".", LocSep)
lblSpeed.Text = "Speed: " & _
(Convert.ToDouble(field(7)) * 1.852).ToString & " km/h"
End If
End If
End Select
Catch ex As Exception
MsgBox("An error has occurred in processGPSData. ")
End Try
End Sub
'---Disconnect menu item---
Private Sub MenuItem3_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MenuItem3.Click
serialPort.Close()
MenuItem1.Enabled = True '---Connect GPS---
MenuItem3.Enabled = False '---Disconnect---
End Sub
'---Server IP menu item---
Private Sub MenuItem4_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MenuItem4.Click
ServerIP = InputBox("Please enter the IP address of server", "Server IP")
End Sub
'---ID menu item---
Private Sub MenuItem5_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MenuItem5.Click
ID = InputBox("Please enter your ID", "ID", "1")
End Sub
Private Sub Form1_Load( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Load
'Tar reda på vilket tecken som används som decimaltecken
LocSep = Mid(1 / 2, 2, 1)
MenuItem3.Enabled = False
End Sub
Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click
End Sub
End Class
Nedanstående kod finns i Sync.vb
Den sköter om synkningen mellan PDA och serverprogrammet
Imports System.Net
Imports System.Net.Sockets
Public Class Sync
Const portNo As Integer = 3456
Dim client As Socket
Public Sub PerformSync( _
ByVal HostIP As String, _
ByVal txtData As String)
Dim RemoteAdd As System.Net.IPAddress = _
System.Net.IPAddress.Parse(HostIP)
Dim endPoint As New IPEndPoint(RemoteAdd, portNo)
Try
client = New Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp)
client.Connect(endPoint)
'---send a message to the server
Dim data As Byte() = _
System.Text.Encoding.ASCII.GetBytes(txtData)
'---send the text---
client.Send(data)
client.Close()
Catch
MsgBox("Kanske inte förbindelse. Kolla att PDA inte är i Flight mode etc...")
End Try
End Sub
End Class
Sv:Kommunicera med GPS-enheten på mobiltfn.
en annan 3300 fråga, har ni problem med att få kontakt med satelliterna inomhus?Sv: Kommunicera med GPS-enheten på mobiltfn.
Rent generellt gäller att för att få en position krävs fri sikt uppåt, dvs inga tak. T.o.m tät skog kan hindra.
Senare tiders GPS-mottagare med Sirf III-chip är betydligt "kraftfullare" och klarar positioneringen inomhus åxå. Jag har själv ingen egen erfarenhet av detta med en kollega till mig säger sig sitta inne i sitt radhus och få utmärkt positionering.
Vad gäller annan info från satelliterna, exempelvis riktning till dem och deras höjd över horisonten osv så kan det fungera även inomhus.Sv: Kommunicera med GPS-enheten på mobiltfn.
//JohannesSv:Kommunicera med GPS-enheten på mobiltfn.
Testade denna, funkar tyvärr inte på P3300.
Detta är nog dock, efter lite rotande på nätet, så att det aldrig kommer en punkt där DataReceived triggas eftersom den kontinuerligt pumpar data på COM-porten.
Däremot så funkar GpsSample-koden i WM6 SDK:n lysande, enda problemet där är att jag inte kan använda den riktigt eftersom jag inte pratar C# utan endast VB.NET :(
Så nu går jag nog snart ut i skjulet och hamrar sönder telefonen i ren ilska.
//JohannesSv: Kommunicera med GPS-enheten på mobiltfn.
Dock så har jag tokfastnat på två rader. Undrar om någon här vet hur man kan göra om eländet till VB.NET
<code>
gps.DeviceStateChanged += new DeviceStateChangedEventHandler(gps_DeviceStateChanged);
gps.LocationChanged += new LocationChangedEventHandler(gps_LocationChanged);
</code>
Jag tänkte mig något i stil med:
<code>
Gps.DeviceStateChanged += New DeviceStateChangedEventHandler(AddressOf gps_DeviceStateChanged)
Gps.LocationChanged += New LocationChangedEventHandler(AddressOf gps_LocationChanged)
</code>
Men det tänkte inte VS2005.
//JohannesSv:Kommunicera med GPS-enheten på mobiltfn.
<code>
AddHandler Gps.DeviceStateChanged, AddressOf gps_DeviceStateChanged
AddHandler Gps.LocationChanged, AddressOf gps_LocationChanged
</code>Sv:Kommunicera med GPS-enheten på mobiltfn.
Det är mer eller mindre exakt samma sak som i WM5 SDK:n
//JohannesSv: Kommunicera med GPS-enheten på mobiltfn.
Nu har jag försökt med steg 2 i den här lilla mojängen.
Den skall rapportera tillbaks till en server var 20:e sekund.
Servern ligger på webben så vad jag gjorde var att stoppa in
en webbrowser kontroll och peka den mot
http://www.doman.com/trace/posupd.aspx?lat=LATITUD&lon=LONGITUD&spd=HASTIGHET&hea=RIKTNING
Då ville jag dessutom bara ha ut positioneringsuppgifterna var 20:e sekund
också. Men det fick jag tydligen inte. Jag använder fortfarande WM6 SDK:n
och öppnar GPS:en. Allt blinkar som det ska, sen var 20:e sekund så anropar jag
t ex: position.Latitude
Men får inte ett jota tillbaks.
Någon som vet varför?
//JohannesSv:Kommunicera med GPS-enheten på mobiltfn.
Måste ju anropa gps.Getposition() först..
//Johannes