[Lazarus-es] Comunicación serial

Antonio Évora aevorar en gmail.com
Mar Jul 16 14:26:50 CEST 2013


El 15/07/13 21:54, Maxi escribió:
> El día 14 de julio de 2013 09:09, Antonio Évora <aevorar en gmail.com> escribió:
>> El 12/07/13 14:41, Maxi escribió:
>>
>>> El día 12 de julio de 2013 09:19, Antonio Évora <aevorar en gmail.com>
>>> escribió:
>>>> Estimados compañeros,
>>>> Estoy depurando una aplicación que recibe información de un GPS usando el
>>>> protocolo NMEA y configurado para que envie solamente tramas GGA y GSA.
>>>> La
>>>> conexion con el pc es mediante usb (usando un conversor COM-USB pues el
>>>> puerto original de GPS es COM, esta conversión es necesaria pues el pc no
>>>> tiene puerto COM) y es reconocido como un COM virtual. En mi aplicación
>>>> uso
>>>> synaser (ultima version disponible en sus repositorios) para la
>>>> comunicación
>>>> llamando al método Recvstring de la clase TBlockSerial llamada desde un
>>>> timer (probado con distintos intervalos de tiempo) y me encuentro con los
>>>> siguientes problemas:
>>>>
>>>> * Problema de inicialización:
>>>>       Si arranco la aplicación no recibe ningún dato del GPS, para que
>>>> empiece
>>>> a recibir datos tengo que:
>>>>           - Cerrar la aplicación
>>>>           - Abrir hyperterminal, conectarme al GPS (este empieza a recibir
>>>> tramas) y cerrar hyperterminal
>>>>           - Abrir la aplicación y empiezo a recibir tramas
>>>>       Con esto intuyo que hyperterminal hace algún tipo de inicialización
>>>> del
>>>> dispositivo que no hace TBlockSerial
>>>>
>>>> * Problema en la recepción de tramas:
>>>>       Hay tramas que llegan solapadas unas con otras, por ejemplo:
>>>>
>>>> $GPGSA,M,3,11,03,16,06,18,22,08,19,01,,,,3.14,1.72,2$GPGGA,194255.90,xxxx.xxxxxxx,N,yyyyy.yyyyyyy,W,4,09,2.09,144.4792,M,49.7596,M,0.9,0000*68
>>>>
>>>> * Inversión del orden de las tramas:
>>>>       Supuestamente la recepción de tramas debería ser:
>>>>           TramaGGA
>>>>           TramaGSA
>>>>                   ...
>>>>           TramaGGA
>>>>           TramaGSA
>>>>                   ...
>>>>           TramaGGA
>>>>           TramaGSA
>>>> Sin embargo durante la recepción se ven invertidas, esto no se si puede
>>>> ser
>>>> debido problema anterior.
>>>>
>>>> El problema debe de estar en la implementación del TBlockSerial o en el
>>>> conversor COM-USB. Yo personalmente me inclino por el conversor (estoy
>>>> trabajando a 115200 baudios) que no da a bastos.
>>>>
>>>> Un cordial saludo y gracias de antemano.
>>>>
>>>>
>>>> _______________________________________________
>>>> Lazarus-es mailing list
>>>> Lazarus-es en lists.lazarus.freepascal.org
>>>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>>>>
>>> No es el conversor, de seguro.
>>> Primero, quien enia datos? el gps? lo consultas o solo transmite?
>>> Si lo consultas si es valido el timer, pero ten en cuanta de
>>> inhabilitar el timer para no solapar llamadas y datos hasta que
>>> termine de recibir.
>>> Si el gps transmite solo a intervalos, no uses el timer, deja que
>>> synaser reciba datos cuando llegan realmente y debes controlar que se
>>> cumpla el bloque esperado sino lo descartas, aveces pasa que se
>>> pierden bits y hasta que no llega otro paquete no se completa el
>>> bloque y recibes informacion falsa.
>>> Verifica que tipo de handshake usa el gps, es el unico caso en que el
>>> adaptador pueda fallar porque no siempre implementan algunos de estos
>>> DTR,RTS,CTS,DSR.
>>>
>>> Cuenta un poco mas
>>> --
>>> El que pregunta aprende, y el que contesta aprende a responder.
>>>
>>> No a la obsolecencia programada:
>>>
>>> http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml
>>>
>>> Linux User #495070
>>> http://domonetic.com/blog
>>>
>>> _______________________________________________
>>> Lazarus-es mailing list
>>> Lazarus-es en lists.lazarus.freepascal.org
>>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>> Gracias Maxi por contestar,
>> El GPS trasmite a intervalos, 10 veces por segundo. Bueno, mejor te explico
>> mejor lo que pretendo hacer:
>> Tengo un GPS el cual debe darme la posición, la cual debo sincronizar con la
>> lectura de un termómetro (conectado también mediante COM), para asignar
>> temperatura a una posición concreta.
>> Otro problema con el que me encuentro es el de poder sincronizar estas
>> lecturas, ya que el termómetro es capaz de darme una medida por segundo y el
>> GPS 10.
>> Supongo que para hacer lo que me cuentas debo de usar el evento OnStatus (lo
>> acabo de ver). ¿Puedes instruirme con un ejemplo sencillo?
>>
>>
>> Un cordial saludo y gracias de antemano.
>>
>> _______________________________________________
>> Lazarus-es mailing list
>> Lazarus-es en lists.lazarus.freepascal.org
>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
> 10 veces por segundo me parece mucho, pero deberias llevar 2 registros
> 1 con los datos del gps y otro con los del termometro, puedes tomar el
> de menor tiempo como base o el del gps y repetir el valor de la
> lectura del termometro.
> Dependiendo que prioridad tienes.
> Yo leeria el termometro, despues habilito la lectura del gps, hago una
> sola lectura y deshabilito. anoto esos datos y espero la proxima
> lectura del termometro. a los fines practicos una lectura por segundo
> en mas que suficiente incluso para ir marcando en un mapa, a menos que
> se trate de algo muy preciso.
>
> --
> El que pregunta aprende, y el que contesta aprende a responder.
>
> No a la obsolecencia programada:
> http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml
>
> Linux User #495070
> http://domonetic.com/blog
>
> _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
Primeramente gracias de nuevo.
Ya he conseguido capturar y casar las diferentes lecturas. Lo que si 
sigo teniendo es el problema de inicialización, copio y pego de mi 
primer post:
* Problema de inicialización:

     Si arranco la aplicación no recibe ningún dato del GPS, para que 
empiece a recibir datos tengo que:

         - Cerrar la aplicación

         - Abrir hyperterminal, conectarme al GPS (este empieza a 
recibir tramas) y cerrar hyperterminal

         - Abrir la aplicación y empiezo a recibir tramas

Con esto intuyo que hyperterminal hace algún tipo de inicialización del 
dispositivo que no hace TBlockSerial


Es decir sin arrancar previamente Hyperterminal no hay tramas que valga :-(

Inicializo los puertos COM con el siguiente codigo:
FCOM.Connect(FPuerto);
ConfiguraPuerto();
Inicializa();

Siendo FCOM del tipo TBlockSerial y:

procedure TMamboSensorCOMBase.ConfiguraPuerto;
var
   ParidadText: char;
begin
   if not FConnected then
   begin
     exit;
   end;

   case FParidad of
     ptEven:
     begin
       ParidadText:='E';
     end;
     ptOdd:
     begin
       ParidadText:='O';
     end;
     ptMarked:
     begin
       ParidadText:='M';
     end;
     ptSpaced:
     begin
       ParidadText:='S';
     end;
   else
     ParidadText:='N';
   end;

FCOM.Config(FBaudios,FBitsDatos,ParidadText,FBitsParada,FControlFlujoSoftware,FControlFlujoHardware);
end;

procedure TMamboSensorCOMBase.Inicializa;
var
   n: integer;
begin
   if not FConnected then
   begin
     exit;
   end;

   for n:=0 to FScriptInicializacion.Count-1 do
   begin
     if FCOM.CanWrite(2000) then
     begin
       FCOM.SendString(FScriptInicializacion[n]);
     end;
   end;
end;

Gracias de antemano.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20130716/3cad0d65/attachment-0002.html>


More information about the Lazarus-es mailing list