Buenas, os voy a poner los pasos para leer las coordenadas del GPS.
Las coordenadas se obtienen mediante el puerto COM, que tenga configurado el PDA para acceder al GPS. En mi caso es el COM4, eso lo mirais en la configuración del PDA. (Si no lo encontrais , id probando :D )
Bueno, al lio!
En el form añadir dos labels, txtLong y txtLat. Un botón llamado btnEmp. Además añadir un control SerialPort y un Timer.
Ahora pasamos a codificar.
Primero añadimos las librerias:
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Imports System.IO.Ports
Creamos las variables:
#Region "Variables"Ahora vamos a crear el constructor.
Public Latitud As String
Public Longitud As String
#End Region
#Region "Constructor"Creamos el código del botón, se limitara a apagar o encender el Timer:
Public Sub New()
' Esto es necesario
InitializeComponent()
' Aqui intentamos abri el puerto
Try
SerialPort1.PortName = "COM4"
SerialPort1.Open()
Catch ex As Exception
MessageBox.Show(ex.Message)
Timer1.Enabled = False
btnEmp.Text = "Empezar"
Return
End Try
End Sub
#End Region
Private Sub btnEmp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEmp.ClickBueno ya nos queda configurar el Timer. Por el puerto Com entran muchas lineas de datos llamadas NEMA.
'Comprobamos el estado del timer y lo invertimos.
If Timer1.Enabled = True Then
Timer1.Enabled = False
Else
Timer1.Enabled = True
End If
If btnEmp.Text = "Empezar" Then
btnEmp.Text = "Parar"
Else
btnEmp.Text = "Empezar"
End If
End Sub
El código comprueba en primer luga, si el puerto serie está abierto , si lo es, lee la salida de datos en una cadena. Cada linea se separa con el simbolo del dolar $ . La cadena que nos interes, comienza por "GPGGA"; este subcadena contiene la latitud y la longitud, además de más información, separada por comas.
Este es el código:
Private Sub timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If SerialPort1.IsOpen Then
'En esta variable, insertamos todo lo leido del Puerto.
Dim datos As String = SerialPort1.ReadExisting()
'Aqui creamos las diferentes lineas, basandonos en el simbolo del dolar
Dim strArr() As String = datos.Split("$")
Dim i As Integer = 0
If strArr.Length > 1 Then
Try
For i = 0 To strArr.Length
'Ahora obtenemos los datos, separados por las comas.
Dim strTemp As String = strArr(i)
Dim lineArr() As String = strTemp.Split(",")
'Si la linea es GPGGA, cojemos los bloques de cadena 2 y 4 (latidud y longitud) y pasamos los datos obtenidos a coordenadas UTM.
If (lineArr(0) = "GPGGA") Then
Try
Dim dLat As Decimal
Dim dLon As Decimal
dLat = Convert.ToDecimal(lineArr(2))
dLat = dLat / 100
Dim lat() As String = dLat.ToString().Split(".")
Latitud = lat(0).ToString() + "." + ((Convert.ToDouble(lat(1)) / 60)).ToString("#####")
txtLat.Text = Latitud
dLon = Convert.ToDecimal(lineArr(4))
dLon = dLon / 100
Dim lon() As String = dLon.ToString().Split(".")
Longitud = lon(0).ToString() + "." + ((Convert.ToDouble(lon(1)) / 60)).ToString("#####")
txtLong.Text = Longitud
Catch
' Si no podemos leer el GPS
'txtLat.Text = "No puedo leer GPS "
'txtLong.Text = "No puedo leer GPS"
End Try
End If
Next
Catch
'No hacemos nada
End Try
End If
Else
txtLat.Text = "Puerto COM Cerrado"
txtLong.Text = "Puerto COM Cerrado"
End If
End Sub
Ya podeís leer las coordenadas de vuestro GPS!.
41 comentarios:
Paco, te confieso que mi conocimiento de las nuevas tecnologías no es , ni por asomo, como el tuyo; pero estamos en ello...
Los blogs como ell tuyo me interesan mucho porque son muy didácticos y poco a poco, con ensayo-error, voy autoaprendiendo.
Me encanta que entre tanto código también aparezca la poesia.
Besadetes
Es todo un placer el poder ayudar. Me alegro que te sirva!. Con el ensayo-error tendras que convivir todo el tiempo que le dediques a la programación :), es lo que tiene esto, nunca se para de descubrir y aprender cosas nuevas. Cuando tengas dudas o mejoras, no dudes en escribir!
Muy buenas Paco!! Espero no molestar... a ver he seguido el tutorial que indicas más arriba sobre la optención de las coordenadas del GPS. Ahora bien, no sé que error cometeré, pero la cadena datos, la que almacena la información del puerto siempre está vacía, con lo que no obtengo nada del puerto... se te ocurre cual puede ser el error?? muchas gracias por la futura contestación y por la ayuda que me ha dado tu blog. saludos ;)
Hola buenas! No molestas tranquilo.. :) Vamos a ver, estás seguro de que estás utilizando el puerto correcto?? además debes dejarlo un rato y en una ventana para que reciba información. Yo mientras probaba, lo que hacía es, imprimir en pantalla esa variable, para ver que es lo que hacia y si recibia. Prueba a ponerla en pantalla y cercioarate de que es el puerto correcto, dejala un rato al aire libre o una ventana y observa. Pregunta sin problemas que te intentare ayudar. Saludos
Ei!! que rápido!! jeje, a ver... el puerto creo que sí es el correcto, xq con los demás me da fallo al intentar abrirlo, o quizás no lo sea!! no sé donde mirar cual es el correcto (estoy con un emulador de WM6)de lo que sí estoy seguro es de que no recibo nada de nada, la variable queda vacía eteeeeernamente jeje. Lo más seguro es que tenga el puerto incorrecto, xo en ese caso ¿No daría fallo al intentar abrirlo? en la config tengo que el puerto del programa gps es el 2, y el del hardware gps no tengo nada, sera por eso?? el de hardware gps no me deja poner ninguno... :S menudo lio!! gracias por la inmediatez de tu respuesta ;)
Ahh vale vale.. ya hace tiempo que deje esto, asi que no me acuerdo muy bien, pero me parece que a mi tampoco me salía nada en el emulador. Lo iva probando en real. Además es mejor porque el emulador suele hacer cosas muy raras. Pruebalo en real y me cuentas!
eeehh!! funciona!! jeje, el problema venía a causa del emulador, que no he podido averiguar como simular lo del GPS pero en el aparato real va de vicio!! jeje.
Por cierto, se podría averiguar también la altura en el eje z??? la altitud vamos. Gracias por todo ;)
Hola, yo tengo un gps 60 garmin. Ocupo conectarlo por USB a mi laptop. ¿¿Que cambios le tendria que hacer al codigo para obtener las cordenadas??
Espero y me puedas ayudar
Te dejo mi correo
gil_larios@hotmail.com
El codigo anterior es interesante, pero entiendo que solo recibe datos de posicion. Yo deseo saber como obtendo las cordenadas desde una apliacion .net 2005 cual es su poicion del gps que puede estar en cualquier lugar, se que los gps tienen un chip con un numero de acuerdo al probeedor..
Espero que me ayuden, gracias por su atencion. Carlos P. T.
Buenas, claro que puedes, aunque aqui no lo detallo, aqui lo que hago es las coordendas (Latidu, Longitud) las muestro en un Label, sin embargo, lo logico, es mandarlo a una base de datos SQL. ¿Como hacerlo?, Pues existen varias maneras, lo normal y mejor (que yo sepa) es crearte un webservice, lo llamas cuando tengas las coordendas y se las pasas, el webservice se encarga de meterlas en SQL y desde Visual explotas la base :) un saludo y suerte!
Yo no le he probado pero esta noche me pongo, ya que estoy muy interesado en programar para wm6 con net. Se programar con vb6 bastante bien, pero ya veo que net varía no lo suficiente para poder ponerme al día en un corto espacio de tiempo.
Un saludo Chavales y muy buen post Pakito
Les comento que ya estuve probando la aplicacion pero me sale un error a lo que defino las variables me sale que no existe el nomrbe de latitud y longitud, no se si alguien ya realizo la prueba de este codigo que ingresaron saludos,
PJ
Prove la aplicacion y me funciona bien. Pero alguien me podria indicar como puedo generar una ruta o una linea mientras me desplazo con el GPS?
Ejemplo: Camino 10 metros y pueda visualizar mi recorrido.
¿este código sirve para moviles con GPS on board?
por ej. el omnia.
te agradezco la respuesta
Juan Pablo
Hola... deseo leer el gps de un xperia x1, este progragrama podra leer?
Hola a todos, la aplicación la he podido probar y me da las coordenada GPS, lo malo es que he encontrado un error Paquito, te lo pongo en un ejemplo:
Si lineArr(4) tiene un valor de: 07900.602327, este pada a ser dividido por 100 y nos da
dLon = dLon / 100 = 07900.602327/100 = 79.006023
Luego se separa el entero del decimal perfectamente, pero cuando se divide 00602327/60 en Double seria 602327/60 por que los 0s a la izquiersa se pieden, asi que la coordena resultante es 79.10038 cuando en realidad deberias se 79.010038, espero haberme hecho entender, se pierde un 0 y en ocasiones se necesitan dos ceros.
Estoy en el analisis de ver en que casos se debe añadir uno o dos ceros, y que problemas hay con la Latitud.
Gracias
Pues sinceramente es muy posible. Gracias por el dato. Lo que pasa que esta parte la tengo muy abandonada. Si deseas compartir lo que vayas descubriendo/arreglando te lo agradeceriamos todos. Yo lo pondre arriba y te dare las gracias! :P SAludos
Estoy a punto de arreglarlo, solo quiero hacer unas ultimas pruebas y les coloco el código, que seria solo de la función timer1_Tick(), ya que el resto esta perfecto.
hola soy un universitario y la verdad desconosco mucho sobre esta tecnologia me gustaria que me explicxara un pocomas de ello, mira actual mente estoy trabajando en como tratar las coordenadas de un gps mira mi correo es kain_32r2@hotmail.com
de ante mano gracias
Hola Pakito, muy bueno el código, me está sirviendo bastante. Pero tengo una duda, a ver si me puedes ayudar. En la cadena de texto que envía el GPS, ¿en qué formato están las coordenadas longitud y latitud? Lo que quiero yo es pasarlas al sistema WGS-84. ¿Es lo que haces en tu transformación? Es que no me queda claro, ¿podrías aclararme esto o echarme un cable para llegar a ese sistema de coordenadas?
Muchas Gracias!
Hola Pakito
Muy bueno el código, y muy útil, pues muchos recién nos iniciamos en esto de la programación.
Tengo una consulta: este código solo trabaja con los datos de latitud y longitud.Cómo harías para leer el dato de la hora? La verdad tengo mucho interés en esa parte, gracias por tu ayuda
Jorge con Now!
Now te devuelve Fecha Hora. Now tiene diferentes propiedades para lo que quieras obtener
Y cómo lo utilizo? Es NMEA o es un comando de visual basic? Disculpa, pero no sé mucho de programación
Entiendo que es una comando de Visual Basic, pero en que parte de tu código lo coloco? En realidad esa es mi duda. Debo aplicarlo a la primera línea de GPGGA?
Buenas Jorge, Now es un "comando" de visual basic .NET . Lo puedes usar cuando quieras!. En este ejemplo las coordenadas las estoy mostrando en dos labels. Para seguir la dinamica de esté ejemplo podrías poner otro label "txtHora" y a ese asignarle el Now. txtHora.Text = Now
Puedes ponerlo debajo de txtLong.Text = Longitud
Suerte!
Grcias Pakito.
Seguí tus indicaciones al pie de la letra, pero todavía me da un error, me sale "txtHora no es un miembro de "Date"". A qué se debe esto?
Como lo estas haciendo??????? algo raro estas haciendo porque eso te suele salir por ejemplo si haces. Date.txHora
Pon ese trozo de codigo si quieres !
Pakito
Pues lo puse tal cual está acá. Le añadí ese trozo de código, justo debajo de txtLong = Longitud, pero me sigue saliendo el mismo error. Tal vez me falta declarar algo más.
De qué tipo debe ser la variable txtHora?
Debo poner una variable Hora, así como Latitud y Longitud?
Te agradezco toda la ayuda que puedas darme
Estoy utilizando el Visual Basic 2008. Entiendo que algunos comandos varían del VB 6 al 2008
Christian
Hola tengo un ipaq 116 y me conecto a internet a traves de bluetooth, y me sale "el puerto 'com1' no existe", podrias ayudame porfavor Pakito
Jorge si todavia estas en eso del error de "txtHora no es un miembro de "Date"" te comento que la etiqueta es de tipo string entonces tienes que utilizar el metodo de conversion a string de la funcion now es decir debes poner txtHora = now.tostring y con eso estara listo ademas el metodo tostring puede llevar parametros es decir le puedes poner el formato en que quieres que lo muestre. suerte saludos.
Hola...
Tengo el problema de los ceros a la izquierda. Un Cero hace que las coordenadas sean defectuosas... alguien logró resolver este problema?
Gracas.
Porfavor.. es muy urgente lo del cero si alguien lo pudiera solucionar.
Sirve también para el omnia por ejemplo?
Gracias
Muchas gracias... necesito saber com llego a este formato xxH xxxxxx xxxxxx
me parese que adjunta latitud con longitud.
Saludos.
Que gps usas? Gracias
Hola Pakito.. tienes alguna idea de como hacer un sistema en donde incluyo un dispositivo en mi auto y a traves de un soft en vb.net puedo saber la posicion en la que este. Gracias
hola, quiero empeza a leer un gps y de acuerdo al lenguaje manejar informacion por el puerto, que gps me sugieren? que lenguaje es mejor? gracias por este aporte
Eduardo
charlone@tandil.com
Hola a todos, se que este tema ya tiene bastante tiempo y Pakito debe de tenerlo bastante olvidado, pero alguien que se pase por aquí podría decirme si se puede leer coordenadas GPS a través de A-GPS y si se hace de la misma forma o similar??
Anonimo, como bien has dicho, lo tengo bastante olvidado, desde esa época no toco nada de gps y este estilo, lo siento por no poder ayudarte, espero que si alguien se pasa y lo sabe, que deje su comentario.
Saludos
Hola Pakito, andaba buscando información de GPS y por fortuna llegué a tu sitio, se que ha pasado mucho tiempo, sin embargo no se si tengas algun ejemplo que me oriente, lo que necesito es muy similar a lo que muestras, pero debo invocarlo desde una aplicación externa, es decir.
Deseo que en mi PC la aplicación me diga en donde está el dispositivo, es decir me devuelva mediante un webservice las coordenadas, tal cual las has obtenido, mi problema seria en como hacer que la aplicación externa encuentre el dispositivo.
Muchas Gracias
Pakito buenas tardes, aqui solicitando tu ayuda para extraer los datos de gps de una hanheld, pero tengo problemas con el puerto, la hanheld esta configurada como puerto de hardware "None" como puedo hacer para abrir ese puerto desde mi aplicacion en vb net, ya que primero checo que puertos tiene la hand held pero solo me saca los puertos com2, com3 , y al elegir para abrir uno de estos me dice que es invalido. Necesito tu ayuda amigo , mi handheld es una dolphin honeywell 6000. saludos
Publicar un comentario