INFO: Recibir datos usando el evento OnComm del control MSComm

Resumen

En este artículo se muestra una plantilla básica para utilizar una rutina de recepción de datos controlada por eventos con el evento OnComm. Éste es el método recomendado para recibir todos los tipos de datos utilizando el control MSComm. Para obtener información sobre cómo convertir los datos binarios, consulte la sección REFERENCIAS al final de este artículo.

Más información

Al utilizar el control MSCOMM para enviar y recibir datos en serie, es mejor usar comunicaciones controladas por eventos. Este método es más eficaz que el sondeo, ya que utiliza menos tiempo de CPU y sólo iniciará una acción cuando se reciba la entrada. A continuación puede consultar una plantilla sencilla que permite la recepción eficaz de caracteres con una pérdida de datos mínima.


La idea es utilizar el evento OnComm para recibir los datos y, a continuación, escribir los datos sin procesar en una cadena y pasarlos a otra rutina que los procese. Pasar los datos a otra rutina permite al evento OnComm recibir cada evento sin ser "suprimido", mientras el análisis real de la cadena tiene lugar en otra parte.


En el ejemplo siguiente se supondrá que tiene un cable de conexión directa conectado entre COM1 y COM2. Esto sólo es necesario para las pruebas. App1 es la aplicación COM1, App2 es la aplicación COM2.

Pasos para crear App1

  1. Cree un nuevo proyecto EXE estándar. De forma predeterminada, se crea Form1.
  2. Elija Componentes en el menú Proyecto, active "Microsoft Comm Control" y haga clic en Aceptar.
  3. Agregue un control MSCOMM al formulario.
  4. Agregue un TextBox y un CommandButton al formulario. Cambie la propiedad MultiLine del TextBox a True.
  5. Agregue el código siguiente en la ventana de código de Form1:
          Private Sub Form_Load()
    Form1.Caption = "App1"
    With MSCOMM1
    .Handshaking = 2 - comRTS
    .RThreshold = 1
    .RTSEnable = True
    .Settings = "9600,n,8,1"
    .SThreshold = 1
    .PortOpen = True
    ' Leave all other settings as default values.
    End With
    Command1.Caption = "&Send"
    Text1.Text = "Test string from App1 "
    End Sub

    Private Sub Command1_Click()
    MSComm1.Output = Text1.Text
    End Sub

    Private Sub Form_Unload(Cancel As Integer)
    MSComm1.PortOpen = False
    End Sub

Pasos para crear App2

  1. Inicie una nueva instancia de Visual Basic.
  2. Cree un proyecto EXE estándar. De forma predeterminada, se crea Form1.
  3. Elija Componentes en el menú Proyecto, active "Microsoft Comm Control" y haga clic en Aceptar.
  4. Agregue un control MSCOMM al formulario.
  5. Agregue un TextBox al formulario. Cambie la propiedad MultiLine del TextBox a True. Amplíe el TextBox para que abarque la mayor parte del formulario, ya que mostrará todos los datos que reciba.
  6. Agregue el código siguiente en la ventana de código de Form1:
          Private Sub Form_Load()
    Form1.Caption = "App2"
    With MSComm1
    .CommPort = 2
    .Handshaking = 2 - comRTS
    .RThreshold = 1
    .RTSEnable = True
    .Settings = "9600,n,8,1"
    .SThreshold = 1
    .PortOpen = True
    ' Leave all other settings as default values.
    End With
    Text1.Text = ""
    End Sub

    Private Sub Form_Unload(Cancel As Integer)
    MSComm1.PortOpen = False
    End Sub

    Private Sub MSComm1_OnComm()
    Dim InBuff As String

    Select Case MSComm1.CommEvent
    ' Handle each event or error by placing
    ' code below each case statement.

    ' This template is found in the Example
    ' section of the OnComm event Help topic
    ' in VB Help.

    ' Errors
    Case comEventBreak ' A Break was received.
    Case comEventCDTO ' CD (RLSD) Timeout.
    Case comEventCTSTO ' CTS Timeout.
    Case comEventDSRTO ' DSR Timeout.
    Case comEventFrame ' Framing Error.
    Case comEventOverrun ' Data Lost.
    Case comEventRxOver ' Receive buffer overflow.
    Case comEventRxParity ' Parity Error.
    Case comEventTxFull ' Transmit buffer full.
    Case comEventDCB ' Unexpected error retrieving DCB]

    ' Events
    Case comEvCD ' Change in the CD line.
    Case comEvCTS ' Change in the CTS line.
    Case comEvDSR ' Change in the DSR line.
    Case comEvRing ' Change in the Ring Indicator.
    Case comEvReceive ' Received RThreshold # of chars.
    InBuff = MSComm1.Input
    Call HandleInput(InBuff)
    Case comEvSend ' There are SThreshold number of
    ' characters in the transmit buffer.
    Case comEvEOF ' An EOF character was found in the
    ' input stream.
    End Select

    End Sub

    Sub HandleInput(InBuff As String)
    ' This is where you will process your input. This
    ' includes trapping characters, parsing strings,
    ' separating data fields, etc. For this case, you
    ' are simply going to display the data in the TextBox.
    Text1.SelStart = Len(Text1.Text)
    Text1.SelText = InBuff
    End Sub

Pasos para ejecutar aplicaciones

  1. Presione la tecla F5 o haga clic en el botón de ejecución de cada proyecto. Tendrá que mover las aplicaciones para que pueda ver a ambas ejecutándose al mismo tiempo.
  2. Asegúrese de que tiene un cable de conexión directa estándar entre COM1 y COM2, o cambie las propiedades MSComm1.Port para que coincidan con los puertos de comunicaciones que está utilizando.
  3. Haga clic en el control CommandButton de App1; debería ver que la cadena "Test string from App1" aparece en el control TextBox de App2 cada vez que haga clic en el botón.

Referencias

Para obtener información sobre cómo convertir los datos binarios, consulte el artículo siguiente en Microsoft Knowledge Base:

158008 : CÓMO: Cómo utilizar MSCOMM32.OCX para transferir datos en DBCS de Windows

Para obtener información adicional, consulte el siguiente artículo de Microsoft Knowledge Base:

194923 : CÓMO: Detectar caracteres de control con el control MSComm
Propiedades

Id. de artículo: 194922 - Última revisión: 12/27/2007 - Revisión: 1

Comentarios