Vale,
A ver si me explico:
La cuestion es que tu lo haces todo dentro de la rutina de atencion.
Esto es el evento OnComm. El programa entra en la rutina cada vez que reciva tantos caracteres como tu le digas. En tu caso 15
Depende a que velocidad este trabajando el puerto, esto ocurre cada muy poco tiempo y esposible que antes de que la funcion haya terminado de procesar estos 15 caracteres ya hayan llegado otros 15. De esta forma se van produciendo retrasos y al final pierdes datos.
Lo que tienes que hacer es no procesarlos del tiron. Simplemente guardalos.
Crea un buffer de almacenamiento temporal. Del tipo string si estas trabajando en modo texto.
Algo como por ejemplo:
Private BufferComm as String
Y que la rutina de atencion simplemente valla metiendo ahi los datos
Private Sub MSComm1_OnComm()
BufferComm = BufferComm & MSComm1.Input
End Sub
Esto lo hara muy rapido
Después habrá otra función que se encargue de procesar estos datos
Private Sub ProcesoDatosComm()
Dim datos as string
datos = BufferComm
BufferComm=""
Call HazLasCuentas ' Esto sería el procesado como tal. Lo que hagas con los datos
End Sub
Aunque mientras estes haciendo esto te lleguen nuevos datos, no los pierdes porque quedan almacenados en el Buffer que has creado esperando a que vuelvas a llamar al procedimiento ProcesoDatosComm
El cuando tines que llamar a la funcion ProcesoDatosComm depende del programa.
Si los datos no llegan frecuentemente si no que son comandos de control por ejemplo y que siempre acaban con un caracter de fin de trama (esto es un supuesto. Tu tendras que mirar cual es tu caso) puedes añadir algo de codigo en la rutina de atencion que se mantenga esperando a que llegue este caracter
algo como:
If instr(BufferComm, caracterControl) <> 0 then Call ProcesoDatosComm
Si los datos simplemente son rocogidos en un momento dado por otro control (es otro supuesto) entonces en la funcion OnComm activas un flag
Cuando el control quiera los datos mirara el flag. Si esta activado entonces sabra que hay datos en el buffer y puede llamar a la rutina ProcesaDatosComm
En el ejemplo que te puse en el anterior Post te decia que podias comprobar que hubiera datos periodicamente (otro supuesto también distinto. Tu mira cual es tu caso y que se te ocurre que es lo mejor que puedes hacer)
Para hacer esto, añades un control Timer y lo programas con un periodo que tu elijas (cada segundo, cada 200 milisegundos, lo que quieras...)
Si no sabes usar el control Timer, mira la ayuda o en google, es muy facil.
En el evento "Timer" de este control añade una comprobacion.Algo como:
Private Sub Timer1_Timer()
If BufferComm <> "" then
Call ProcesaDatosComm
End If
Timer1.Enable=True
End Sub
De esta forma, se comprobara el buffer periodicamente pero sin interrumpir la llegada de datos.
Espero que esta vez me hayas entendido y que te haya servido de algo.
Por favor dime si conseguiste resolverlo y si por el contrario aun tienes dudas o problemas no dudes en preguntar ¿vale?
Suerte y un saludo