Leer de buffer con MSCOMM

Estoy leyendo de un módem de la siguiente manera, que me devuelve muchos mensajes con los me sincronizo a través de vbNewLine para saber hasta donde llega cada uno
Do
DoEvents
buffer$ = buffer$ & forma.MSComm.Input
Loop
Until InStr(buffer$,vbnewline)
Mi problema es que hay veces que me lo hace bien y otrasveces se descontrola y mezcla unos mensajes con otros. Me gustaría saber si puedo leer lineas enteras o si alguien ha hecho algo parecido me ayudara.
Respuesta
1
El problema que tienes es que no estás usando correctamente el control MS Comm, la forma de leer los datos no se puede hacer en un bucle. Te pongo un ejemplo mínimo de como leer la información:
Option Explicit
Private Sub Form_Load()
MSComm1.Settings = "9600,N,8,1"
MSComm1.InputMode = comInputModeText
'MSComm1.InputMode = comInputModeBinary
MSComm1.InputLen = 0
'MSComm1.InputLen = 1
MSComm1.CommPort = 1
MSComm1.PortOpen = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSComm1.PortOpen = False
End Sub
Private Sub MSComm1_OnComm()
Dim b As String
'Dim b As Byte
If MSComm1.CommEvent = comEvReceive And MSComm1.InBufferCount > 0 Then
'Has recibido datos
b = MSComm1.Input
'b = MSComm1.Input(0)
End If
End Sub
Cada vez que "ocurre" algo en el puerto se dispara MSComm1_OnComm. Lo que "ha ocurrido" se especifica en MSComm1. CommEvent, y será aquí donde tendrás que implementar tus funcionalidades.
Bueno lo primero comentarte que no tengo un sistema en el que probar este tipo de conexión, así que te hago mis comentarios de "oidas", puesto que no puedo comprobarlos.
Las propiedades del puerto debes definirlas ANTES de abrirlo, y por tanto no es correcto Me.MSComm.InputLen = 1 en el evento MSComm1.OnComm. Si quieres recibir cadenas de texto, deberás poner MSComm.InputLen = 0 antes de MSComm.PortOpen.
Otra cosa que creo que falla tiene que ver con los caracteres de control. Si desde el equipo remoto envías el mensaje "Hola" & vbCrLf & "Adios", en tu equipo el evento OnComm se dispara dos veces: primero recibes "Hola" y después "Adios". El carácter vbCrLf no se incluye en ninguno de los 2 mensajes recibidos (creo). Si quieres utilizar caracteres especiales en mitad de un mensaje, entonces tendrás que utilizar la transmisión en modo binario y procesar byte a byte.
Lo de MSComm.Output = Chr(13) no lo entiendo, ya que puedes leer cuanta información te llegue por el puerto sin necesidad de que tengas que enviar ningún tipo de acuse de recibo. En cualquier caso, probablemente el equipo remoto reciba dos mensajes
Al enviar Chr(13), ya que puede ser que se interprete como "" & vbCrLf & "".
Haz pruebas y coméntame como te ha ido. Tranquilo que no molestas, a mi me gustan estos problemas, xD.
Muchas gracias por tu ayuda, pero la verdad es que tampoco hay manera. Esto es lo que yo hago:
PRIVATE SUB MSCOMM_ONCOM()
Dim Mensaje As String
Mensaje = ""
Me.MSComm.InputLen = 1
'si se ha recibido algun caracter en el buffer
If Me.MSComm.CommEvent=comEvReceive And Me.MSComm.InBufferCount <> 0 Then
cadBuf=Me.MSComm.Input
If Asc(Right(cadBuf, 1)) = 10
Then
ProcesaComando
End If
MSComm.Output = Chr(13)
End If
END SUB
PRIVATE SUB PROCESACOMANDO()
Select Case Left(cadBuf, 6)
Case valor1
'Hace operaciones
Case valor2
'Hace operaciones
End Select
END SUB
Te explico un poco lo que intento hacer:
Voy a recibir en el buffer muchísimos mensaes en tiempo real, separados por vbCr & vbLf, intento leer el mensaje y dependiendo de la cabecera que tenga hago una operación un otra.
Para ir recibiendo mensajes le envío al bufer la orden MSComm.Output = Chr(13), pq si no lo hago se corta la operación. La cosa es q los mensajes los tengo q recibir perfectos, y actualmente no lo hace se mezclan o no los muestra, ...
¿QUÉ es lo que estoy haciendo mal?
Muchas gracias por tu ayuda y perdona las molestias
Muchas gracias, ya lo he solucionado, y es que tenia que ver con las propiedades RthRehold Sthrehold, que las he puesto a 1. Muchas gracias por tu ayuda

1 respuesta más de otro experto

Respuesta

Es gracioso pero luego de 11 años me ayudaron muchísimo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas