Autor Tema: ¿Cómo hago para reconocer los caracteres CR y LF? VB 6 (SOLUCIONADO)  (Leído 6885 veces)

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

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Colegas,
estoy realizando un proyecto (con VB 6) en el cual recibo datos de un puerto serial y los cargo en un listbox. Los datos consisten en 5 caracteres (3 números, LF y CR).
Estos datos provienen de un PIC el cual me envía 510 datos y al final una consulta de si quiero seguir recibiendo datos.
Uno de los problemas que tengo es que quiero quedarme únicamente con los números recibidos eliminando el LF y CR. Yo pensaba que tal vez exista la forma de que cada vez que en el buffer de entrada del puerto com aparece LF+CR saltara a un evento, pero no he encontrado algo que se le parezca.

Este es el código que tengo:

Código: [Seleccionar]

Option Explicit


'-------------------Definición de variables-------------------

Dim entrada As String       'variable usada para los datos de entrada
Dim salida  As String       'variable usada para los datos de salida
Dim n As Double             'variable contador de entrada
'-------------------Fin definición de variables-------------------

'-------------------Se carga la ventana---------------------------
Private Sub form_load()
        salida = 0                          'inicializo variables
        entrada = 0                         'inicializo variables
        lblEstado.Caption = "Bienvenido"    'mensaje de bienvenida
End Sub
'-------------------Fin carga de ventana--------------------------


'-------------------Cierro la ventana-----------------------------

Private Sub Form_Unload(Cancel As Integer)
        puerto.PortOpen = False                      'cierro el puerto cuando cierro la ventana
End Sub
'------------------fin cierro la ventana---------------------------


'-------------------Botón conectar--------------------------------
Private Sub cmdcon_Click()
            If cmdCon.Caption = "Conectar" Then                                 'si el botón conectar dice conectar
                puerto.CommPort = txtCom                                        'utilizo el número de com escrito en la caja de texto
                puerto.PortOpen = True                                          'abro el puerto de comunicaciones
                cmdCon.Caption = "Desconectar"                                  'cambio la escritura del botón conectar a Desconectar
                lblEstado.Caption = "Puerto COM" & puerto.CommPort & " abierto" 'etiqueta estado con el mensaje del com abierto
            Else
                puerto.PortOpen = False                                         'cierro el puerto de comunicaciones
                cmdCon.Caption = "Conectar"                                     'Cambio la escritura del botón a conectar
                lblEstado.Caption = "Puerto COM" & puerto.CommPort & " cerrado" 'etiqueta estado con el mensaje del com cerrado
    End If
End Sub
'------------------Fin botón conectar------------------------------


'------------------botón recibir------------------------------------

Private Sub cmdRecibir_Click()
            n = 0
            If cmdCon.Caption = "Desconectar" Then              'si el botón conectar dice desconectar, entonces..
                puerto.Output = salida + Chr(13)                'salida lo mándo por el puerto más el caracter ASCII 13
             Else
                MsgBox ("Primero elija el puerto COM y luego presiones conectar") 'si no me conecte me salta éste cartel
            End If
End Sub
'-----------------fin Botón enviar---------------------------------


Private Sub puerto_OnComm()                                 'procedimiento que se ejecuta cada vez que hay un evento en el puerto serie
    If puerto.CommEvent = comEvReceive Then                 'verifica si el evento fue generado por la recepción de datos
        n = n + 1                                           'incremento n para contar los datos que me llegan
        entrada = puerto.Input                              'cargo entrada con lo que me llega
        lstRecibido.AddItem n & " - " & entrada, 0          'agrego los datos a la lista con el número del contador al principio
    End If
End Sub


MScomm tiene configurado InputLen=5 el resto está por defecto.

Lo otro que pasa es que en las pruebas que hecho, muy pocas veces los datos que recibo quedan en orden (por ej. 123<LF><CR>), siempre aparecen <CR>123<LF> y por lo que vi es que el primer dato recibido son 4 números y la lista queda:
0123<LF>
<CR>123<LF>
Y así sucesivamente...

Bueno gente cualquier idea, aporte o comentario es más que bienvenido.
Muchas gracias!!

« Última modificación: 09 de Junio de 2011, 21:02:11 por proyecto2009utu »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: ¿Cómo hago para reconocer los caracteres CR y LF? VB 6
« Respuesta #1 en: 01 de Junio de 2011, 01:46:13 »
Yo pondría un filtro al cargar la variable entrada para que sólo añada dígitos decimales:

Private Sub puerto_OnComm()                                 'procedimiento que se ejecuta cada vez que hay un evento en el puerto serie
    If puerto.CommEvent = comEvReceive Then                 'verifica si el evento fue generado por la recepción de datos
        n = n + 1                                           'incremento n para contar los datos que me llegan
        if (puerto.Input>='0') and (puerto.Input<='9') then
              entrada = puerto.Input                              'cargo entrada con lo que me llega
        End If
        lstRecibido.AddItem n & " - " & entrada, 0          'agrego los datos a la lista con el número del contador al principio
    End If
End Sub

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: ¿Cómo hago para reconocer los caracteres CR y LF? VB 6
« Respuesta #2 en: 02 de Junio de 2011, 10:44:47 »
la función real de LF o CR es solo para mostrar texto. yo siendo tu, le digo al pic que no envié dichos caracteres, y tomo los datos usando las función MID$

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Re: ¿Cómo hago para reconocer los caracteres CR y LF? VB 6
« Respuesta #3 en: 04 de Junio de 2011, 15:49:05 »
Nocturno,
gracias por la rápida respuesta!!, lo probé pero no me funciono, lo copie tal cual de la página, lo primer es que me da un error con las comillas alrededor del 0 y del 9, se las saco y no funciona.
Te pido disculpas por la demora en contestar pero estuve un poco complicado con el trabajo...  :?


PalitroqueZ,
gracias por la respuesta! lo pruebo y posteo los resultados.


Muchas gracias!!!


abrazo de gol!

Desconectado DaYeS

  • PIC16
  • ***
  • Mensajes: 119
Re: ¿Cómo hago para reconocer los caracteres CR y LF? VB 6
« Respuesta #4 en: 04 de Junio de 2011, 17:38:35 »
Y reemplazandolos, quiero decir con:

Aquí:
Código: [Seleccionar]
lstRecibido.AddItem n & " - " & entrada, 0 

Poner:
Código: [Seleccionar]
lstRecibido.AddItem n & " - " & Replace(Replace(entrada, vbCR,""),vbLF,""), 0Vamos, reemplazando el LF y CR por una cadena vacia, precece una chapucilla, pero a lo mejor te funciona bien.

Salu2

Si buscas resultados distintos, no hagas siempre lo mismo. Albert Einstein.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: ¿Cómo hago para reconocer los caracteres CR y LF? VB 6
« Respuesta #5 en: 04 de Junio de 2011, 19:20:32 »
Hola! Hay que analizar detenidamente la trama de entrada.

Código: Visual Basic
  1. Private Sub puerto_OnComm()                                 'procedimiento que se ejecuta cada vez que hay un evento en el puerto serie
  2.    If puerto.CommEvent = comEvReceive Then                 'verifica si el evento fue generado por la recepción de datos
  3.        n = n + 1                                           'incremento n para contar los datos que me llegan
  4.        entrada = puerto.Input                              'cargo entrada con lo que me llega
  5.        AnalizeAsyncBuffer (entrada)                        'enviar trama a ser analizada...
  6.    End If
  7. End Sub
  8.  
  9. Public Sub AnalizeAsyncBuffer(ByVal inpBuff As String)
  10.     Static step As Integer
  11.     Static msgTmp As String
  12.     Dim i As Integer
  13.  
  14.     For i = 1 To Len(inpBuff)
  15.         Select Case Mid(inpBuff, i, 1)
  16.             Case "0" To "9"
  17.                 If step < 3 Then
  18.                     msgTmp = msgTmp & Mid(inpBuff, i, 1)
  19.                     step = step + 1
  20.                 Else                        'trama invalida. reiniciar...
  21.                    msgTmp = vbNullString
  22.                     step = 0
  23.                 End If
  24.             Case vbCr
  25.                 If step = 3 Then
  26.                     step = step + 1
  27.                 Else
  28.                     msgTmp = vbNullString   'trama invalida. reiniciar...
  29.                    step = 0
  30.                 End If
  31.             Case vbLf
  32.                 If step = 4 Then AddIncomingData (msgTmp)
  33.                 msgTmp = vbNullString   'trama invalida. reiniciar...
  34.                step = 0
  35.             Case Else
  36.                 msgTmp = vbNullString       'trama invalida. reiniciar...
  37.                step = 0
  38.          End Select
  39.     Next
  40. End Sub
  41.  
  42. Private Sub AddIncomingData(ByVal dataStr As String)
  43.  
  44.    'MsgBox dataStr
  45.   lstRecibido.AddItem dataStr, 0          'agrego los datos a la lista
  46. End Sub

El codigo que escribi deberia interpretar correctamente cualquier trama válida, sin importar si se recibe trozada.
El problema de recibir las tramas con un offset(<CR>123<LF>), seguramente sea porque estas enviando un byte( o más de uno) al puerto antes de comenzar a enviar las tramas válidas(revisar programa del uC). También puede ser por ruido provocado por los integrados hardware, como MAX232, MAX485, la linea de datos, etc. Igualmente, y pese a que soluciones esas dos posibilidades, siempre un protocolo de recepción por byte, y no por paquete, debería contemplar la posibilidad de recibir las tramas con un offset cualquiera y aún así ser capaz de recibirlas y analizarlas correctamente. Un hot pugging del cable serie puede, seguramente, provocar el mísmo comportamiento de tramas con offset. El código que adjunto te permite aceptar cualquier tipo de trama, siempre y cuando se respete la estructura que mencionaste. Caso contrario la trama se descarta.

Para resultados óptimos, poné las propiedades InputLen = 0 y rThreshold = 1 en tu control MSComm.
InputLen = 0 hace que se lea TODO el contenido disponible en el buffer de entrada.
rThreshold = 1 produce que el evento <comEvReceive> se produzca cada vez que arriba un byte al puerto. Esto permite analizar inmediatamente el dato arribado.

Si es un programa donde la veracidad de los datos es crítica, deberías contemplar agregarle un CRC a cada trama, para verificar la integridad de los datos.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Re: ¿Cómo hago para reconocer los caracteres CR y LF? VB 6
« Respuesta #6 en: 09 de Junio de 2011, 18:00:06 »
PalitroqueZ,
gracias por la idea!! lamentablemente no lo pude probar.... oops!

DaYeS,
gracias por la respuesta, la implemente y elimina los caracteres lf y cr bien de bien de bien. Muchas gracias!

BrunoF,
impecable explicación, he estuve estudiando el código que mandaste para poder entenderlo (soy bastante novel en VB), y le hice unos cambios (Lo estoy probando).

Actualmente el problema que tengo es que se cuelga el programa de VB6, pero también estpy trabajando con una máquina virtual con XP, y dentro de ella ejecuto proteus con el PIC además del VB6 en modo de ejecución. Tengo que quemar el programa en un pic y ver que pasa.

Posteo el código tal cual lo tengo ahora para que le peguen una ojeada.

Código: [Seleccionar]

Option Explicit             '

'-------------------Definición de variables-------------------

Dim entrada As String       'variable usada para los datos de entrada
Dim salida  As String       'variable usada para los datos de salida
Dim n As Double             'variable contador de entrada
'-------------------Fin definición de variables-------------------


'-------------------Se carga la ventana---------------------------
Private Sub form_load()
        salida = 0                          'inicializo variables
        entrada = 0                         'inicializo variables
        n = 0                               'inicializo variables
        tmrTimer.Enabled = False            'deshabilito el timer
        lblEstado.Caption = "Bienvenido"    'mensaje de bienvenida
End Sub
'-------------------Fin carga de ventana--------------------------


'-------------------Cierro la ventana-----------------------------

Private Sub Form_Unload(Cancel As Integer)
        tmrTimer.Enabled = False                         'deshabilito el timer
        If cmdCon.Caption = "Desconectar" Then
            puerto.PortOpen = False                      'cierro el puerto cuando cierro la ventana
        End If
End Sub
'------------------fin cierro la ventana---------------------------


'-------------------Botón conectar--------------------------------
Private Sub cmdcon_Click()
            If cmdCon.Caption = "Conectar" Then                                 'si el botón conectar dice conectar
                puerto.CommPort = txtCom                                        'utilizo el número de com escrito en la caja de texto
                puerto.PortOpen = True                                          'abro el puerto de comunicaciónes
                cmdCon.Caption = "Desconectar"                                  'cambio la escritura del botón conectar a Desconectar
                lblEstado.Caption = "Puerto COM" & puerto.CommPort & " abierto" 'etiqueta estado con el mensaje del com abierto
            Else
                tmrTimer.Enabled = False                                        'deshabilito el timer
                puerto.PortOpen = False                                         'cierro el puerto de comunicaciones
                cmdCon.Caption = "Conectar"                                     'Cambio la escritura del botón a conectar
                lblEstado.Caption = "Puerto COM" & puerto.CommPort & " cerrado" 'etiqueta estado con el mensaje del com cerrado
    End If
End Sub
'------------------Fin botón conectar------------------------------


'------------------botón recibir------------------------------------
Private Sub cmdRecibir_Click()
            n = 0
            If cmdCon.Caption = "Desconectar" Then                                  'si el botón conectar dice desconectar, entonces...
                entrada = 0                                                         'fuerzo entrada a 0 para que se envíe la solicitud de datos
                tmrTimer.Enabled = True                                             'habilito el timer de envio de solicitud de datos
            Else
                MsgBox ("Primero elija el puerto COM y luego presiones conectar")   'si no me conecte me salta éste cartel
            End If
End Sub
'-----------------fin Botón enviar---------------------------------


'-----------------Temporizador---------------------------------
Private Sub tmrTimer_Timer()
        entrada = puerto.Input                              'cargo en entrada los datos que llegan
        If entrada = "1" & vbCr Then                        'la variable entrada es 1<CR>....
            lblEstado.Caption = "confirmación OK"           'el label me indica que recibio la confirmación
            puerto.Output = "recibido"                      'para pruebas con el docklight
            tmrTimer.Enabled = False                        'deshabilito el timer
        Else                                                'si entradadistinto de 1...
            lblEstado.Caption = "Enviando pedido"           'label indica que se está enviando el pedido
            puerto.Output = "1" + Chr(13)                   'mándo 1 por el puerto más el caracter ASCII 13 <CR>
        End If
End Sub
'-----------------Fin Temporizador---------------------------------


'-----------------Botón Borrar-----------------------------------
Private Sub cmdReset_Click()
    n = 0                                                   'inicializo n
    lstRecibido.Clear                                       'limpio la lista, queda en blanco
End Sub
'-----------------Fin botón borrar--------------------------------


'-----------------Procedimiento al recibir datos---------------------------------
Private Sub puerto_OnComm()                                                                         'procedimiento que se ejecuta cada vez que hay un evento en el puerto serie
            entrada = puerto.Input                                                                  'lo que llega lo mando a la variable entrada
            If tmrTimer.Enabled = True And entrada = "1" & vbCr Then                                'la variable entrada es 1<CR>....
                tmrTimer.Enabled = False                                                            'deshabilito el timer
                lblEstado.Caption = "confirmación OK"                                               'el label me indica que recibió la confirmación
            Else
                n = n + 1                                                                           'incremento n para contar los datos que me llegan
                'lstRecibido.AddItem n & " - " & Replace(Replace(entrada, vbCr, ""), vbLf, ""), 0    'agrego los datos a la lista con el número del contador al principio y elimino los caracteres lf y cr.
                AnalizeAsyncBuffer (entrada)                                                        'enviar trama a ser analizada...
            End If
End Sub
'-----------------Fin Procedimiento al recibir datos---------------------------------
 
 
'-----------------Procedimiento que analiza los datos de entrada---------------------------------
Public Sub AnalizeAsyncBuffer(ByVal inpBuff As String)
    Static step As Integer
    Static msgTmp As String
    Dim i As Integer
   
    For i = 1 To Len(inpBuff)                                   'desde 1 hasta el número de caracteres que contenga entrada
        Select Case Mid(inpBuff, i, 1)                          'revisa cada caracter recibido
            Case "0" To "9"                                     'casos en el que el caracter es un valor de 0 al 9
                If step < 3 Then
                    msgTmp = msgTmp & Mid(inpBuff, i, 1)
                    step = step + 1
                Else                                            'trama invalida. reiniciar...
                    msgTmp = vbNullString
                    step = 0
                End If
            Case vbLf
                If step = 3 Then
                    step = step + 1
                Else
                    msgTmp = vbNullString                       'trama invalida. reiniciar...
                    step = 0
                End If
            Case vbCr
                If step = 4 Then
                    AddIncomingData (msgTmp)
                    msgTmp = vbNullString                       'trama invalida. reiniciar...
                    step = 0
                End If
            Case Else
                    msgTmp = vbNullString                       'trama invalida. reiniciar...
                    step = 0
        End Select
    Next
End Sub
'-----------------Fin del procedimiento que analiza los datos de entrada---------------------------------


'-----------------Procedimiento que agrega los datos a la lista---------------------------------
Private Sub AddIncomingData(ByVal dataStr As String)
    'MsgBox dataStr
    lstRecibido.AddItem n & " - " & dataStr, 0                          'agrego los datos a la lista
End Sub
'-----------------Fin del Procedimiento que agrega los datos a la lista---------------------------------


No me canso de agradecer el esfuerzo por ayudarme. Muchas muchas gracias!!
Espero sus comentarios.

Un abrazo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: ¿Cómo hago para reconocer los caracteres CR y LF? VB 6
« Respuesta #7 en: 09 de Junio de 2011, 18:38:27 »
Hola.

Deberias diferenciar el tipo de evento del puerto. Especialmente el comEvReceive que es el que se produce cuando hay RThreshold o más cantidad de caracteres en el buffer de entrada...

Por otro lado, por quee lees el  buffer desde el timer? Solamente deberias leerlo desde el evento de recepcion, no desde ambos lugares.

Cuando un paquete es valido, se llama al procedimiento AddIncomingData, ahi es donde deberias analizar los datos del paquete y transformarlos en informacion util para tu app.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Re: ¿Cómo hago para reconocer los caracteres CR y LF? VB 6
« Respuesta #8 en: 09 de Junio de 2011, 21:00:51 »
BrunoF,
Muchas gracias, seguí tus recomendaciones y quedo bien de bien el programa (sos un grosso).
Explico como funciona todo el sistema (PIC 18F4550).
1 - Cuando la PC le manda 1<CR>, el PIC le responde 1<CR> he inmediatamente le me manda 510 muestras de los que tiene en el puerto B.
2 - El programa en VB6 numera los datos recibidos y los muestra en un textlist
3 - Cuando el PIC termina de mandar los datos queda a la espera, si le mando 1<CR> leer el paso 1.

Un detalle con el programa de VB6: cuando le pido al PIC que mande los datos (envía 1<CR> hacia el PIC), hay un temporizador que sigue enviando 1<CR> hasta que el PIC responde con 1<CR>.

Bueno, después de todas las recomendaciones que recibí el programa quedo así:

Código: [Seleccionar]

Option Explicit             '

'-------------------Definición de variables-------------------

Dim entrada As String       'variable usada para los datos de entrada
Dim salida  As String       'variable usada para los datos de salida
Dim n As Double             'variable contador de entrada
'-------------------Fin definición de variables-------------------


'-------------------Se carga la ventana---------------------------
Private Sub form_load()
        salida = 0                          'inicializo variables
        entrada = 0                         'inicializo variables
        n = 0                               'inicializo variables
        tmrTimer.Enabled = False            'deshabilito el timer
        lblEstado.Caption = "Bienvenido"    'mensaje de bienvenida
End Sub
'-------------------Fin carga de ventana--------------------------


'-------------------Cierro la ventana-----------------------------
Private Sub Form_Unload(Cancelar As Integer)
        If MsgBox("¿Realmente desea salir?", vbYesNo Or _
        vbQuestion Or vbDefaultButton1, "Confirmación") = vbNo Then             'msgbox con botónes si-no, con foco en no e icono de pregunta
            If cmdCon.Caption = "Desconectar" Then                         'si cerramos, mira si el puerto esta conectado para desconectarlo
                puerto.PortOpen = False
                Cancelar = True
            Else
            Cancelar = True
            End If
        Else
            Cancelar = False                                                    'si no cerramos el programa
        End If
End Sub
'------------------fin cierro la ventana---------------------------



'-------------------Botón conectar--------------------------------
Private Sub cmdCon_Click()

    On Error GoTo msgError                                                      'sí hay un error llama a la etiqueta msgError

            If cmdCon.Caption = "Conectar" Then                                 'si el botón conectar dice conectar
                puerto.CommPort = txtCom                                        'utilizo el número de com escrito en la caja de texto
                puerto.PortOpen = True                                          'abro el puerto de comunicaciónes
                cmdCon.Caption = "Desconectar"                                  'cambio la escritura del botón conectar a Desconectar
                lblEstado.Caption = "Puerto COM" & puerto.CommPort & " abierto" 'etiqueta estado con el mensaje del com abierto
            Else
                tmrTimer.Enabled = False                                        'deshabilito el timer
                puerto.PortOpen = False                                         'cierro el puerto de comunicaciones
                cmdCon.Caption = "Conectar"                                     'Cambio la escritura del botón a conectar
                lblEstado.Caption = "Puerto COM" & puerto.CommPort & " cerrado" 'etiqueta estado con el mensaje del com cerrado
            End If
Exit Sub


msgError:                                                                       'Etiqueta error
            If Err.Number <> 0 Then
                MsgBox "Se ha producido el siguiente error:" & vbCrLf & _
                Err.Number & ", " & Err.Description, 48, "Oops! Falló...."      'msgbox que indica el error con el icono 48 (crítico)
            End If

End Sub
'------------------Fin botón conectar------------------------------


'------------------botón recibir------------------------------------
Private Sub cmdRecibir_Click()
            n = 0
            If cmdCon.Caption = "Desconectar" Then                                  'si el botón conectar dice desconectar, entonces...
                entrada = 0                                                         'fuerzo entrada a 0 para que se envíe la solicitud de datos
                tmrTimer.Enabled = True                                             'habilito el timer de envio de solicitud de datos
            Else
                MsgBox "Primero elija el puerto COM y luego presione conectar", 48, "No se ha conectado un puerto COM" 'si no me conecte me salta éste cartel
            End If
End Sub
'-----------------fin Botón enviar---------------------------------


'-----------------Temporizador---------------------------------
Private Sub tmrTimer_Timer()
            lblEstado.Caption = "Enviando pedido"           'label indica que se está enviando el pedido
            puerto.Output = "1" + Chr(13)                   'mándo 1 por el puerto más el caracter ASCII 13 <CR>
End Sub
'-----------------Fin Temporizador---------------------------------


'-----------------Botón Borrar-----------------------------------
Private Sub cmdReset_Click()
    n = 0                                                   'inicializo n
    lstRecibido.Clear                                       'limpio la lista, queda en blanco
End Sub
'-----------------Fin botón borrar--------------------------------


'-----------------Procedimiento al recibir datos---------------------------------
Private Sub puerto_OnComm()                                                                             'procedimiento que se ejecuta cada vez que hay un evento en el puerto serie
            If puerto.CommEvent = comEvReceive Then
                entrada = puerto.Input                                                                  'lo que llega lo mando a la variable entrada
                If entrada = "1" & vbCr Then                                                            'la variable entrada es 1<CR>....
                    tmrTimer.Enabled = False                                                            'deshabilito el timer
                    lblEstado.Caption = "confirmación OK"                                               'el label me indica que recibio la confirmación
                Else
                    AnalizeAsyncBuffer (entrada)                                                        'enviar trama a ser analizada...
                End If
            End If
End Sub
'-----------------Fin Procedimiento al recibir datos---------------------------------
 
 
'-----------------Procedimiento que analiza los datos de entrada---------------------------------
Public Sub AnalizeAsyncBuffer(ByVal inpBuff As String)
    Static step As Integer
    Static msgTmp As String
    Dim i As Integer
   
    For i = 1 To Len(inpBuff)                                   'desde 1 hasta el número de caracteres que contenga entrada
        Select Case Mid(inpBuff, i, 1)                          'revisa cada caracter recibido
            Case "0" To "9"                                     'casos en el que el caracter es un valor de 0 al 9
                If step < 3 Then
                    msgTmp = msgTmp & Mid(inpBuff, i, 1)
                    step = step + 1
                Else                                            'trama invalida. reiniciar...
                    msgTmp = vbNullString
                    step = 0
                End If
            Case vbLf
                If step = 3 Then
                    step = step + 1
                Else
                    msgTmp = vbNullString                       'trama invalida. reiniciar...
                    step = 0
                End If
            Case vbCr
                If step = 4 Then
                    AddIncomingData (msgTmp)
                    msgTmp = vbNullString                       'trama invalida. reiniciar...
                    step = 0
                End If
            Case Else
                    msgTmp = vbNullString                       'trama invalida. reiniciar...
                    step = 0
        End Select
    Next
End Sub
 
 
Private Sub AddIncomingData(ByVal dataStr As String)
    n = n + 1                                                           'incremento n para contar los datos que me llegan
    lstRecibido.AddItem n & " - " & dataStr, 0                          'agrego los datos a la lista
End Sub


Me quedan comentar alguna lineas.

Muchas gracias a todo por sus aportes. Doy por solucionado el problema, aunque si tienen algún otro aporte es más que bienvenido.

Un Abrazo!

PD: les dejo una captura de la ventana del programa.


Desconectado DaYeS

  • PIC16
  • ***
  • Mensajes: 119
Re: ¿Cómo hago para reconocer los caracteres CR y LF? VB 6 (SOLUCIONADO)
« Respuesta #9 en: 10 de Junio de 2011, 18:53:37 »
Felicidades por haber solucionado el problema, como suelo decir: "Funciona, pues no lo toques", jeje.

Puedes mirar diferentes formas de hacerlo, pero si la que tienes te funciona y la entiendes (para solucionar errores) no veo la necesidad de cambiarla.

Salu2
Si buscas resultados distintos, no hagas siempre lo mismo. Albert Einstein.