Resumen Aclaraciones sobre el Mscomm Control   (2 mensajes )

Saludos Juan Mauel y los de la lista.


Coloco esta información en la lista ya que creo que es importante para todos:

    La utilizacion del Control MScomm es muy sencilla aunque parezca algo enredado al principio, lo primero que debes saber es que este control tiene un solo evento que es en OnComm(). Este evento se dispara cuando cuando su propiedad (oculta), CommEvent acarrea un valor. Es importante saber que el control trabaja por si solo y genera el evento si ha ocurrido algo en el puerto. La información que puede detectar el control es la siguiente:


Estas, son declaraciones de constantes ( de eventos):

comEvSend = 1 'Evento Send.

comEvReceive = 2 'Evento Receive.

comEvCTS = 3 'Cambia a la línea CTS.

comEvDSR = 4 'Cambio a la línea DSR (conjunto de datos preparado).

comEvCD = 5 'Cambio a la línea CD.

comEvRing = 6 'Detección de llamada.

comEvEOF = 7 'Fin de archivo.


Estas, son declaraciones de constantes ( de errores):

comBreak = 1001 'Se ha recibido una señal de pausa.

comCTSTO = 1002 'Excedido el tiempo de espera de borrar para enviar (CTS).

comDSRTO = 1003 'Excedido el tiempo de espera de conjunto de datos listo (DSR).

comFrame = 1004 'Error de marco.

comOverrun = 1006 'Pérdida de información por sobrecarga del puerto.

comCDTO = 1007 'Excedido el tiempo de espera de detección de portador (CD).

comRxOver = 1008 'Se ha desbordado el búfer de entrada.

comRxParity = 1009 'Error de paridad.

comTxFull = 1010 'Búfer de transmisión lleno.


Estas, son declaraciones de constantes ( de manejo de control de linea ):

comNone = 0 'Sin protocolo.

comXonXoff = 1 'Protocolo XOn/XOff.

comRTS = 2 'Protocolo RTS/CTS (solicitar para enviar/borrar para enviar).

comRTSXOnXOff = 3 'Los protocolos RTS y XOn/XOff.


    Muy bien, ahora explicando un poco para que sirven estos valores comienzo por lo siguiente:

En las comunicaciones seriales existen algunas señales intrinsicas al medio que hay que tener claras para desarrollar una aplicacion. Cuando hablo de señales son indicadores de un estado determinado en una linea del cable físico.( Para saber mas de eso refierase a información sobre Hardware de Puerto serial RS-232)


    ¿Ahora, como se comporta el Control MsComm ante estos cambios?


    El valor comEvReceive en el evento OnComm, indicará a la aplicación que se recibieron datos en el puerto Serial. El disparo de este evento esta sujeto a la configuracion en la propiedad RThresHold la cual establece el numero de caracteres que debe esperar el control para avisar a la aplicacion que ha recibido algo.


    El valor comEvSend en el evento OnComm, indicará a la aplicacion que se enviaron datos por el puerto serial. El disparo de este evento esta sujeto a la configuracion en la propiedad SThreshold la cual establece el numero de caracteres que debe esperar para avisar a la aplicacion que se enviaron datos.


    Importante es aclarar que si se coloca SThreshold en 0(cero), se inhabilita la posibilidad de transmitir datos. o mismo ocurre con RThresHold que al colocarse en un valor de 0, se inhabilita la posibilidad de recibir datos.


    Estas dos funciones trabajan conjuntamente con las propiedades InBufferSize (para recepcion de datos) y OutBufferSize (para transmision de datos), InBufferSize establece el tamaño del buffer intermedio para transmitir datos, este buffer se utiliza si el dispositivo del otro lado tiende a tener problemas con la recepcion de los datos que se le envía. OutBufferSize establece el tamaño del buffer de transmision de datos. Si el valor de InBufferSize es muy bajo (eso depende de las condiciones del enlace serial y la velocidad de transmision) se corre el riesgo que se pierdan datos de recepción ( valor de comRxOver ). Lo mismo pasa con OutBufferSize con comTxFull.


    Para evitar los problemas de perdida de datos tanto en transmision como en recepcion se usa el control de flujo de informacion que se establece con comXonXoff (Control de flujo por software), comRTS(control de flujo por Hardware), comRTSXOnXOff(Control de flujo por Software y Hardware). Aqui es donde la cose se pone compleja ya que si usted decide utilizar Control de fluo por Software debera hacer uso de otros estados de otras lineas en el cable.


    Para la mayoría de las aplicaciones no utilizar el control de flujo funciona, sin embargo ya que hables de una balanza, me imagino que la distancia entre el computador y la balanza es considerable, esto implica tener un manejo del flujo de control de error, para ese caso específico sería bueno considerar la utilizacion de casi todas las lineas del puerto serial, para tener una idea de esto debo decir que un puerto serail RS-232 se compone de las siguientes líneas, este es el conector serial detras del PC:


25 Pines 9 Pines Abrev. Nombre de Linea

Pin 2 Pin 3 TXD Transmit Data

Pin 3 Pin 2 RXD Receive Data

Pin 4 Pin 7 RTS Request To Send

Pin 5 Pin 8 CTS Clear To Send

Pin 6 Pin 6 DSR Data Set Ready

Pin 7 Pin 5 SG Signal Ground

Pin 8 Pin 1 CD Carrier Detect

Pin 20 Pin 4 DTR Data Terminal Ready

Pin 22 Pin 9 RI Ring Indicator


    Según la tabla anterior, puedo decir que para una comunicacion serial el el 90% de los casos se pueden conectar TXD, RXD y SG, para control de flujo se utiliza TXD,RXD,RTS,CTS,DSR,DTR,SG en ocasiones se incluye el CD, algunos dispositivos necesitan de los modems externos la señal RI que cambia de estado cuando hay un ring en la linea, aunque la mayoria de estos modems indica con datos RING cuando esta repicando.


    La forma estandar de conectar dos dispositivos seriales es TXD con RXD( si invertidos) y SG con SG.


    Ahora volviendo al control MsComm, y quiere practicar algo, conectando dos PC de la forma anterior descrita es decir TXD(en el PC #1) con RXD en el (PC #2) y viceversa mas los dos SG conectados, se puede desarrollar una aplicacion que transfiera datos de un PC a otro y viceversa ( claro esto ya lo trae Windows con lo de conexion directa por cable, pero puedo decir que hace 9 años construí una aplicacionen GWBasic, para poder transferir datos desde un Epson Abacus con un Kaypro 2000 de la misma manera... Que tiempos aquellos)


    Ayudando a responder a alguien que pregunto en la lista acerca que abría el modem, podía marcar etc pero no sabe como detectar que del otro lado colgaron el telefono, esto se puede hacer simplemente con la señal CD en la mayoría de los casos.


    Lo último que me falta comentar para el control es el establecimiento de los parametros de velocidad y paridad para la comunicacion entre los dispositivos, estos parametros deben ser iguales entre el PC y la Balanza, en el control MsComm se establece con la propiedad Settings que tiene un formato "Baudios,Paridad,Datos,Bit de parada" sin caer en mucho detalle sobre estos valores, te recomiendo que chequees en el manual de la balanza para setear a la balanza o al control con parametros exactamente iguales entre ambos FIJATE BIEN, ya que si algo es distinto, no tendras comunicacion correcta entre ellos .


    Específicamente hablando del caso de la balanza que deseas conectar debes hacer lo siguiente:


1.- Establecer Settings en el control según los de la Balanza.

2.- Si la balanza envia los datos de forma de un bloque de datos fijo es decir: supongamos que la balanza transmite el siguiente bloque de información cada vez que registra un peso: "CCC999999,999CCC" y suponemos que CCC son caracteres de control de inicio y fin de la secuencia y 999999,999 es el peso registrado, si es asi entonces puedes setear el parametro InBufferSize a 16, ya que es la suma de todos los bytes que transmite la balanza cada vez que registra un peso.

3.- Si la balanza no transmite un bloque fijo de datos debes colocar a InbufferSize en 1.

4.- Para leer la Balanza debes usar la propiedad Input, la cual es la propiedad que te permite leer los datos en el buffer de recepcion de datos en el PC que llegaron de la Balanza, cada vez que ejecutas Input, se leen los datos y se borran del buffer (cuidado con eso).



Luego que hagas eso puedes hacer todas las pruebas necesarias, mas informacion puedes conseguir en la ayuda del control que trae el mismo Visual Basic.


Si necesitas mas ayuda puede enviarme un mail a mi direccion directamente para no saturar la lista.


Bien, espero haberte ayudado y a los amigos de la lista poder comprender mejor el funcionamiento del contro MsComm.


quedo a disposicion si se tiene alguna duda.




jmrojas wrote:

Hola amigos de la lista !!!


Necesito ayuda de alguno de ustedes que haya usado el control MScomm, ya

que me estan ofreciendo desarrollar una aplicación que lea el peso de

unos productos desde una balanza digital ......


Espero la ayuda de ustedes ....


Agradecido de antemano...

Juan Manuel Rojas Bravo



--


Saludos de Asdrubal Velasquez

Internet: <<0000,0000,fefemailto:yv6esd@comports.com>0000,0000,fefemailto:yv6esd@comports.com

ICQ #:7993678

Packet: yv6esd@yv6esd.#yvnet.poz.ven.sa

Puerto Ordaz - Venezuela

  

Mensaje enviado por "Juan Carlos Alvarez" <jcarlos.alvarez@abitab.com.uy>

Te mando un ejemplo...

Cuando abras el puerto no deberías recibir automaticamente, solo si es que programas el evento OnComm, aqui te mando un ejemplito...

Private Sub com_OnComm()
    Dim EVMsg As String
    Dim ERMsg As String
    Dim vr As Integer
    'Procesar de acuerdo con la propiedad CommEvent
    Select Case com.CommEvent
        'Mensajes relativos a sucesos
        Case comEvReceive
            RecibirCom
        Case comEvSend
            'Por ahora no hago nada
        Case comEvCTS
            EVMsg = "Cambio detectado en CTS"
        Case comEvDSR
            EVMsg = "Cambio detectado en DSR"
        Case comEvCD
            EVMsg = "Cambio detectado en DCD"
        Case comEvRing
            EVMsg = "El teléfono está sonando"
        Case comEvEOF
            EVMsg = "Fin de fichero"

        'Mensajes de error
        Case comBreak
            EVMsg = "Interrupción detectada"
        Case comCTSTO
            ERMsg = "Tiempo para CTS sobrepasado"
        Case comDSRTO
            ERMsg = "Tiempo para DSR sobrepasado"
        Case comFrame
            EVMsg = "Error de transmisión (encuadre)"
        Case comOverrun
            ERMsg = "Error de sobrescritura"
        Case comCDTO
            ERMsg = "Tiempo para DCD sobrepasado"
        Case comRxOver
            ERMsg = "Buffer de recepción lleno"
        Case comRxParity
            EVMsg = "Error de paridad"
        Case comTxFull
            ERMsg = "Buffer de transmisión lleno"
        Case Else
            ERMsg = "Error o suceso desconocido"
    End Select

    If Len(EVMsg) Then
        'Visualizar el mensaje EVMsg
        MsgBox EVMsg
        EVMsg = ""
    ElseIf Len(ERMsg) Then
        'Visualizar el mensaje de error
        Beep
        vr = MsgBox(ERMsg, 1, "Pulse Cancelar para salir, Aceptar para ignorar.")
        ERMsg = ""
        'Si se pulsó Cancelar
        If vr = 2 Then
            com.PortOpen = False 'Cerrar el puerto y salir
        End If
    End If
End Sub


Private Sub RecibirCom()
    Dim NumCars As Integer
    Dim BufferEnt, info As String

    If err Then MsgBox err.Description, 48
    'Leer datos del puerto
    com.InputLen = 0
    NumCars = com.InBufferCount
    If NumCars Then
        BufferEnt = com.Input
        info = Mid(BufferEnt, 1, 1)
      'Aqui puedes continuar con tu info
    End If
End Sub

Saludos y espero que te sirva Juan.

-----Mensaje original-----
De: Honey Hernandez [mailto:honey@tabacuba.com.cu]
Enviado el: martes, 30 de octubre de 2001 17:12
Para: visualbasic-esp@yahoogroups.com
Asunto: (VB-ESP) Puerto serie
Importancia: Alta


Saludos a todos

Tengo que hacer un programa que lea del com1 la información que transmite
una pizarra telefónica y no he podido hacer mucho con la ayuda del MSComm,
si alguien pudiera decirme como hacerlo le agradecería eternamente.

EL problema es que según la ayuda en cuanto abra el puerto debería comenzar
a recibir y no es así, el problema no es la pizarra pues con el
hiperterminal funciona perfectamente.

Desde ya muchas gracias.



Resumen Resumen

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com