Page 1 of 1

Leer GPS

Posted: Wed Jul 18, 2007 11:43 am
by Andrés González
Tengo una HP6515 la cual consta de un GPS interno, he intentado leer el puerto de comunicaciones y me ocurre que en todos los puertos que me da comunicacion me sale el mensaje con unos cuadrados sin ninguna informacion (puertos 1 y 3) y los puertos que no existe ya me dice que no tiene comunicacion.
He cogido el ejemplo del foro ingles:

Code: Select all

#include "FWCE.ch"

#define GENERIC_READ 0x80000000
#define GENERIC_WRITE 0x40000000
#define GENERIC_REWRITE 0xC0000000
#define OPEN_EXISTING 3
#define FILE_ATTRIBUTE_NORMAL 0x00000080

function Main()

local oWnd, oTimer, oChk
local hPort
local nPollTime := 1000
local lOnOff := .T.

hPort := CreateFile( "COM4:",GENERIC_REWRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL )

if hPort == -1
	MSGALERT("No Puedo abrir el puerto...")
	return -1
else
	 MSGALERT(hPort)
endif


DEFINE WINDOW oWnd TITLE "BlueTime"

@ 2, 2 BUTTON "GPS On/Off" SIZE 80, 30 ACTION (lOnOff := OnOff( hPort, oTimer, lOnOff ), oChk:refresh)

@ 10, 2 CHECKBOX oChk VAR lOnOff PROMPT "On/Off" OF oWnd SIZE 80, 20

if hPort != -1
   DEFINE TIMER oTimer OF oWnd;
          INTERVAL nPollTime;
          ACTION ReadGPS(hPort, oTimer)
endif

ACTIVATE WINDOW oWnd

CloseHandle( hPort )

return nil

function ReadGPS( hPort, oTimer )

local nChr := 1
local cText := ""
local n := 1

oTimer:DeActivate() // stops timer - waits for data

do while nChr > 0 .and. n < 21
			nChr := ReadByte( hPort )
			cText := cText + Chr( nChr )
			n++
end do

msginfo( cText )

oTimer:Activate() // restarts timer

return nil

function OnOff( hPort, oTimer, lOnOff )
if hPort != -1
	if lOnOff
		oTimer:DeActivate() // stops timer
	else
		oTimer:Activate() // starts timer
	endif
endif
return !(lOnOff)
Preguntas:
1) Tengo que hacer algo en la pda para que me lea la informacion del gps, por ejemplo hay que iniciarlo. He leido que si otra aplicacion utiliza el puerto ya no puedo leer la informacion. Pero lo raro es que veo que con el TomTom tarda en leer la informacion del GPS, y con el programa me la da inmediatamente pero mal por lo que se ve.
2) Existe en la pda algo similar a los dispositivos de hardware de windows donde te informa que puertos de comunicaciones tienes.
3) Alguien ha hecho algo similar, solo quiero obtener las coordenadas del GPS, para integrarlas en mi aplicacion.

Posted: Tue Jul 24, 2007 8:09 pm
by luis.santeliz
yo creo q tu problema es la conversion ascii -> unicode, yo tuve un problema asi con una impresora irda y hacia lo mismo.. puros cuadritos y basura en general. lo resolvi utilizando la funcion del api de windows MultiByteToWideChar()

un ejemplo de su utilizacion es:

Code: Select all

   
const int tamano = 20;
const int arraysize  = sizeof(TCHAR)*tamano;
   const int arraysizeW = sizeof(WCHAR)*tamano;
   TCHAR szOrigen[arraysize];
   WCHAR szCadena[arraysizeW];

   memset(szOrigen, 0, arraysize);
   memset(szCadena, 0, arraysizeW);

   StringCbCopyA((LPSTR)szOrigen, arraysize,(LPSTR) hb_parc(1)  );

   MultiByteToWideChar(CP_ACP,0,(LPCSTR)szOrigen,arraysize,szCadena,arraysizeW );
donde

hb_parc(1): es el parametro de la cadena ascii a convertir
szCadena: es un puntero a una cadena de WCHAR osea char unicode
tamano: es el tamaño que tu quieres que tenga el buffer, es importante destacar que en este ejemplo se utiliza la funcion StringCbCopy() cuyo uso es ampliamente recomendado ya q protege el buffer de cualquier desbordamiento dandole a nuestra aplicacion seguridad y estabilidad. Esta funcion es de la libreria strsafe.lib

Posted: Wed Jul 25, 2007 11:19 am
by Antonio Linares
Luis,

FWPPC proporciona AnsiToWide() y WideToAnsi() que hacen ese trabajo automaticamente