TODOPIC

Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: todopic en 22 de Febrero de 2004, 17:10:00

Título: MSCOMM
Publicado por: todopic 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.






Título: RE: MSCOMM
Publicado por: todopic 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.

Título: RE: MSCOMM
Publicado por: Golden_Eagle 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.
Título: RE: MSCOMM
Publicado por: Xa2 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!!
Título: RE: MSCOMM
Publicado por: Abago 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...
Título: RE: MSCOMM
Publicado por: Xa2 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
Título: RE: MSCOMM
Publicado por: Abago 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...
Título: RE: MSCOMM
Publicado por: bagmel 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.
Título: RE: MSCOMM
Publicado por: bagmel 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.
Título: RE: MSCOMM
Publicado por: Modulay 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
Título: RE: MSCOMM
Publicado por: bagmel 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
Título: RE: MSCOMM
Publicado por: Modulay 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
Título: RE: MSCOMM
Publicado por: Colores 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!!!
Título: RE: MSCOMM
Publicado por: Modulay 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!!
Título: RE: MSCOMM
Publicado por: JorgitoFRyOle 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
Título: RE: MSCOMM
Publicado por: Lager. en 11 de Enero de 2005, 13:09:00
Que onda  JorgitoFRyOle,
EL  MID() te regresa en una variable tipo RESULTADOstring el formato obtenido de stringATRABAJAR definido por la longitud de inicio y la longitud de tamaño(esta opcional) de la siguiente forma:

RESULTADOstring= MID(stringATRABAJAR,longitud_de_inicio,longitud_de_tamaño)

Ejemplo :stringATRABAJAR = "Jorgito FR y OLE"
                RESULTADOstring=MID(stringATRABAJAR,9,2) "Texto Resultado es FR
Actua como filtro (tambien estan el Len(),left() right(),Instr(),split(),etc..)

¿de donde sale la sentencia if err then msgbox err.description, 48? no entiendo bien tu pregunta pana aqui lo que se hace es poner un error , podrias agregarle vbOKOnly,etc.. como todo msgbox . Este error viene tipificado por el sistema.asi que no hay que definirlo.
Un salu2
Título: RE: MSCOMM
Publicado por: ardnax en 18 de Enero de 2005, 06:03:00
Hola, soy alexandra por favor necesito ayuda en serio.
Estoy tratando de conectar un lector escritor de tarjetas con chip y necesito obtener los datos de esta tarjeta enviandole un comando de lectura y realmente no se como hacerlo me podrian ayudar.
A la tarjeta ya la detecto usando Visual lo que no se es como manipular el pic desde visual basic este lector consta de 2 conectores un rj45 y rj11, ademas tiene un conector db9 (td, rd, y ground)
Como hago la comunicación serial por fa ayudenme
Mi correo es ardnax@mixmail.com  
Título: RE: MSCOMM
Publicado por: JorgitoFRyOle en 18 de Enero de 2005, 06:54:00
Buenas:

Yo estoy haciendo algo parecido, solo que yo utilizo un lector de proximidad, yo aun toy en como detectar la tarjeta con visual basic. Como lo has hecho?


Otra cosa, respecto a tu problema, no he entendido exactamente cual es? Lo que hago yo para establecer la comunicacion serie entre el pc y el pic es un protocolo de comunicacion. He dejado informacion en este mismo foro acerca de como construirlo.

http://miarroba.com/foros/ver.php?foroid=46840&temaid=3091622

Si tienes alguna duda, ya sabes donde toy

Ah, otra cosa, como haces para que tu lector lea el codigo de la tarjeta? Mi lector utiliza 3pines, un clock, un data y un strobe que me indica cuando esta a 0 que esta transmitiendo los datos, pero como hago para recojerlos? Tengo mil dudas y no me doy aclarao para programarlo.

A ver si alguien me puede ayudar, gracias

1saludo y animo a tos
Título: RE: MSCOMM
Publicado por: ardnax en 19 de Enero de 2005, 08:02:00
Detecta tarjeta con chip dentro de un lector escritor conectado al comm

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
" Constantes para los códigos de control
Const STX = 2
Const ETX = 3
Const EOT = 4
Const SOH = 1
Const ENQ = 5
Const ACK = 6
Const NAK = 21
Const ETB = 23
Const ESC = 27
Private Sub Command1_Click() "botón que transmite el precio
Dim datos As String
Dim dato As String
" Envía una descripción y un precio de prueba
serie.Output = Chr(EOT) + Chr(STX) + "88" + "218" + "0" + Chr(ETX)
serie.InputLen = 1
dato = serie.Input
If dato <> "" Then
dato = Hex(Asc(dato))
Text1.Text = dato
Else
ms
End If

End Sub
Private Sub Form_Load()
serie.PortOpen = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
serie.PortOpen = False
End Sub
Private Sub Timer1_Timer()
serie.Output = Chr(EOT) + Chr(ENQ)
End Sub

Funciona lo que necesito es obtener los datos de esta tarjeta por fa ayudenme estoy desesperada.
Título: visual basic puerto serial, ayuda
Publicado por: ladofes en 28 de Febrero de 2011, 02:07:06
hola, quisiera saber si me puedes ayudar , necesito enviar varios datos del pic16f877a (  leo dos entradas analogicas, y lo que quiero es tomar su valor en visual basic y mostrarlos en 2 textbox) uso el VB 6, y pues programo en pic basic , quisiera alguna ayuda u orientacion por favor