La Web del Programador: Comunidad de Programadores
 
    Pregunta:  17258 - PROBLEMAS CON EL EVENTO ONCOM DEL CONTROL MSCOMM
Autor:  Montse Morancho Ciutat
Estoy desarollando una aplicación donde necesito capturar información de un dispositivo conectado en un puerto serie.

He desarrollado la aplicación basándome en el evento ONCOM para interceptar la información que me llega del puerto, y en mi ordenador funciona sin ningún tipo de problema. El problema ha aparecido cuando he instalado el programa (el ejecutable) en otros ordenadores y aunque aparentemente el programa se ejecuta sin problemas, después de muchas pruebas, he llegado a la conclusión que el evento ONCOM no se ejecuta.

Se seguro que no es problema de puerto, porque lo he probado en varios ordenadores y en todos ellos si se utiliza un programa para acceder al puerto, por ejemplo el hyperterminal (con la misma configuración en que se abre el puerto en el programa), veo perfectamente todos los datos que me van llegando. Había pensado que no fuera un problema de versiones del MSCOMM32.OCX, pero por este lado no consigo nada.

Si hay alguien que tenga una solución o sugerencias acerca de este tema se lo agradecería muchisimo.

PD. La solución de ir consultando periódicamente, mediante un timer, si tengo algo en el puerto ya la he pensado, y aunque lo he utilizado como solución provisional, no me sirve porque necesito recibir la información en el momento en que se genera, y no de forma retardada.

Gracias anticipadas.

  Respuesta:  Fk
El problema que te sucede es de velocidades de los distintos ordenadores donde ejecutas tu aplicación. Cuando mandas una consulta hacia el exterior y esperas una respuesta debes de detener unos milisegundos la ejecución de tu ordenador para dar tiempo al periférico que te ha de responder, esto lo logras con la API Sleep. Te mando un pequeño ejemplo de una aplicación propia donde un ordenador esta conectado a un autómata programable y se comunican a trav´´es del puertosérie. Espero que te sirva de ayuda.

Public Function Plc(ByVal Text As String) As String
Dim Strg As String
Dim Salir As Byte
Dim DatosRecibidos As String

Salir = 0: CountLoop = 0: DatosRecibidos = ""
Strg = "Mi pregunta al autómata"
MSComm1.InBufferCount = 0
MSComm1.InputLen = 0
MSComm1.Output = Strg
Do
Sleep 60
RetDoEv = DoEvents()
If MSComm1.InBufferCount > 0 Then
DatosRecibidos = DatosRecibidos & MSComm1.Input
Else
MSComm1.Output = Strg
End If
CountLoop = CountLoop + 1
Loop Until InStr(DatosRecibidos, Chr(13)) Or CountLoop = 10
'En mi caso la respuesta del autómata devuelve al final un Chr(13)
Plc = DatosRecibidos
End Function

Saludos

  Respuesta:  Fredy Ramirez
Podrias utilizar una Sub( ) en donde manipules el buffer de entrada, ya que me sucidio una vez lo mismo que a ti y fue debido a que la comunicacion por diversas causas no se efectua a la misma velocidad en todas las computadoras. Es probable que nececites la ayuda de un reloj para poder estar seguro de que el buffer contiene todos los datos que requeridos.

Espero que esto te sirva de algo.