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. |