[Lazarus-es] Comunicación serial

Maxi maximiliano.duarte en gmail.com
Lun Jul 15 21:54:46 CEST 2013


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




More information about the Lazarus-es mailing list