Autor Tema: MSCOMM  (Leído 18644 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
MSCOMM
« en: 22 de Febrero de 2004, 17:10:00 »
Hola, esto lo encontre por algun lado, y es interesante para los que quieran comunicar con el mscomm
-------------8<----------------------8<-----------------8<------------8<---
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 cosa 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.


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






Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
RE: MSCOMM
« Respuesta #1 en: 22 de Febrero de 2004, 17:13:00 »
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.

Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado Golden_Eagle

  • PIC16
  • ***
  • Mensajes: 135
RE: MSCOMM
« Respuesta #2 en: 16 de Abril de 2004, 15:19:00 »
Hola, tengo un problemita con el mscomm.
Estoy usando la linea RTS del com1 para controlar el sentido de direccion de datos en una comunicacion HalfDuplex.

Necesito hacer esto "MSComm1.RTSEnable = False" ni bien el puerto termine de enviar los 4 bytes q estaban en una variable.
Pero no se que evento usar.
Intenté seteando el STHreshold en 1, con lo que al quedar vacio el buffer de transmision se produciria el evento "oncomm.comEvSend"(segun entiendo)  Pero valiendome de esto  se pone en cero el RTS, antes de que  los datos terminen de salir por el puerto, con lo que se me corta la comunicacion.

Bueno.. si no fui muy claro con la descripcion del problema les pego el codigo.  acepto cualquier idea!! gracias.

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
RE: MSCOMM
« Respuesta #3 en: 29 de Junio de 2004, 04:53:00 »
Buenas!!
Querría saber como se podrían comunicar dos PCs por el puerto serie!!
La duda es si que hay que especificar que la comunicacion es bidireccional, ya que se van a enviar y recibir datos, aunque si no es al mismo momento no habria ningun problema, creo yo, no lo se!
Si me pudierais ayudar por favor lo agradeceria!!
Saludos!!

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: MSCOMM
« Respuesta #4 en: 29 de Junio de 2004, 11:13:00 »
para comunicar dos equipos por puerto serie, solo necesitas un cable null modem
y abrir un progama terminal en ambos equipos...
poco mas...

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
RE: MSCOMM
« Respuesta #5 en: 29 de Junio de 2004, 11:23:00 »
Si eso ya lo tengo hecho, gracias de todos modos, pero me referia a como podria ser el programa en Visual Basic para hacer el terminal, y claro, luego para hacer uno pequeños cambios y que funcione para conectar un Pic con un PC por medio de la max-232!!
Saludos

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: MSCOMM
« Respuesta #6 en: 29 de Junio de 2004, 17:38:00 »
Como muy bien explica noberto...
hay tienes las librerías y gran parte del modo de funcionamiento del mscomm control...
hace tiempo utilicé parte de código de un hiperterminal que localicé por la red... pero no puedo decirte de donde lo saqué porque hace ya mas de un año...
si lo encuentro, te lo paso...
de todos modos, busca en el google algú simulador de terminal o hiperterminal para vb
luego solo queda tu pericia para adaptarlo a tus necesidades..

y sobre el tema de conectar tu circuito al pc, efectivamente, solo tienes que usar el max232 y conectalo hacia el puerto serie...
y hacer un programa que hable con el pc...

Desconectado bagmel

  • PIC12
  • **
  • Mensajes: 56
    • Semaforos los Llanos C.A.
RE: MSCOMM
« Respuesta #7 en: 08 de Julio de 2004, 00:04:00 »
amigos como hago una aplicacion residente en memoria para controlar el puerto rs232 que todo lo que reciba en el puerto lo guarde en una base de datos.
La necesidad es la madre de todos los inventos!!!!!!!!!!!!!!

Desconectado bagmel

  • PIC12
  • **
  • Mensajes: 56
    • Semaforos los Llanos C.A.
RE: MSCOMM
« Respuesta #8 en: 08 de Julio de 2004, 00:06:00 »
amigos como hago una aplicacion residente en memoria para controlar el puerto rs232 que todo lo que reciba en el puerto lo guarde en una base de datos.
La necesidad es la madre de todos los inventos!!!!!!!!!!!!!!

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: MSCOMM
« Respuesta #9 en: 08 de Julio de 2004, 01:44:00 »
Una vez tengas implementada la aplicación,si lo que quieres es que se ejecute siempre al iniciar windows sólo tienes que añadir un acceso directo de ésta(o el mismo ejecutable en el directorio (windows xp):
C:Documents and SettingsAll UsersMenú InicioProgramasInicio
Para W98,si no me equivoco,la ruta sería:
C:WINDOWSMenú InicioProgramasInicio
Así puedes conseguir que una aplicación se ejecute en segundo plano al arrancar el ordenador.
Espero te ayude.
Saludos

Desconectado bagmel

  • PIC12
  • **
  • Mensajes: 56
    • Semaforos los Llanos C.A.
RE: MSCOMM
« Respuesta #10 en: 08 de Julio de 2004, 11:14:00 »
Si modulay esa forma la se ando buscando es que quede en la derecha de la barra como el messenger y si tyenen algun codigo de visual c++ que me sirva de partida se los agradeceria
La necesidad es la madre de todos los inventos!!!!!!!!!!!!!!

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: MSCOMM
« Respuesta #11 en: 08 de Julio de 2004, 13:37:00 »
No estoy seguro de esto pero creo que esa opción la puedes implementar cuando empaquetas tu aplicación,es decir cuando generas el setup.exe con sus respectivas añadiduras.
Un saludo

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
RE: MSCOMM
« Respuesta #12 en: 08 de Julio de 2004, 21:56:00 »
La opción de Modulay del arranque junto con Windows es válida.
Otra es crear una clave en el registro o en Win98  también puede ser en el win.ini o system.ini
Para dejar el programa funcionando en segundo plano o en la tray ya es más complicado. No está en las funciones del asistente de empaquetado. Se debe hacer con llamadas a funciones API de Windows.
Si querés un ejemplo completo de como hacer esto y mucho más (crear tu propia barra de herramientas, ejecutar aplicaciones desde tu programa, etc) pegále un vistazo a éste ejemplo...
http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=26238&lngWId=1
...es impresionante y está el códdigo fuente!!!

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: MSCOMM
« Respuesta #13 en: 09 de Julio de 2004, 04:35:00 »
Un ejemplo estupendo,Colores2!!
Para arrancar una aplicación al iniciar windows mediante windows.ini sería modificando la que suele ser la segunda línea de dicho archivo de esta forma:
load= "aplicacion.exe" (la aplicación debe estar en la carpeta windows,si no recuerdo mal)
Esta técnica de los archivo de inicio de windows es usada por algunos troyanos para adherirse al sistema.

Desde Málaga,España...saludos!!

Desconectado JorgitoFRyOle

  • PIC12
  • **
  • Mensajes: 79
RE: MSCOMM
« Respuesta #14 en: 11 de Enero de 2005, 09:50:00 »
Buenas

Estoy realizando una comunicacion rs232 y estuve buscando ayuda en el foro, y encontre el ejemplo que hay en este lugar que me esta sirviendo de gran ayuda pero tengo una duda
¿En la funcion recibircom cual es la tarea de la funcion mid?

He intentado averiguarlo y la unica idea es que devuelve el primer caracter del buffer de recepcion, pero en este caso no le encuentro su utilidad

A ver si alguien me puede decir para que sirve

De paso pregunto otra duda, ¿de donde sale la sentencia
 if err then msgbox err.description, 48?

Gracias por todo, 1saludo