Yo creo, Patricia, que vas a tener problemas con ese enfoque. Te explico
porque: ese metodo funciona solo si en cada evento de recepcion recibis uno
y solo un mensaje y si lo recibis completo.

Esas dos condiciones rara vez se dan en la practica. Lo mas comun es que,
por cuestiones de demoras en el sistema operativo, se acumulen mas de un
mensaje en la recepcion o, peor aun, un mensaje completo y parte del
siguiente.

Lo que esto significa es que vas a comenzar a perder mensajes porque no
tendras maneras de almacenar el mensaje parcial.

Es por esto que te decia que deberias separar la recepcion de su extraccion.

Te paso adjunto un pequeño ejemplo en VB, falta la logica de extraccion
porque no la conozco pero te tiro algunas pistas.

----------------------------------
Carlos Peix

2010/12/8 Patricia Banfi <[email protected]>

> Si, Carlos , lo recibí, pero no supe implementarlo, por eso volví a empezar
> de cero.
> Ahora ya tengo resuelta la recepción , la identificación de cada registro y
> el cálculo del check sum.
> Muchísimas gracias
>
> --- El *mié 8-dic-10, Carlos Peix <[email protected]>* escribió:
>
>
> De: Carlos Peix <[email protected]>
> Asunto: [vbnet] Lectura de un puerto RS232
> Para: "vbnet List Member" <[email protected]>
> Fecha: miércoles, 8 de diciembre de 2010, 9:02
>
> Hola Patricia,
>
> No me queda claro si recibiste el mail en el que te describia paso a paso
> mi recomendacion.
>
>  1) Deberias crear un buffer (una variable de instancia de tipo string en
> el formulario).
>
> 2) Cada vez que recibis algo en el puerto deberias concatenarlo en esa
> variable, NADA MAS. Aqui no haces analisis y revision de lo recibido.
>
> 3) Colocar un timer en el mismo formulario y que cada vez que se dispara
> analice el la variable de tipo string y extraiga los mensajes de acuerdo a
> los caracteres de delimitacion. Por supuesto que esta funcion deberia
> retirar el mensaje leido desde el buffer.
>
> Por mas que ajustes el tamaño del buffer del puerto, nunca vas a tener un
> procesamiento confiable porque vas a depender de recibir los mensajes
> completos en el puerto y eso es muy dificil.
>
> Contame como tenes la implementacion porque se ahce dificil aconsejarte a
> ciegas.
>
> ----------------------------------
> Carlos Peix
>
> 2010/12/8 Patricia Banfi 
> <[email protected]<http://ar.mc576.mail.yahoo.com/mc/[email protected]>
> >
>
>   Necesito leerlo porque analizando ese carácter me doy cuenta cuando
> comienza y termina la transmisión y si tengo que evaluar los dos check digit
> que vienen al final de algunos registros.Hasta ahora no lo hice porque
> estaba probando la recepcion.En el archivo adjunto fuí grabando lo que entró
> por el puerto serie.
> Gracias
>
> --- El *mar 7-dic-10, Cristian A. Lòpez 
> <[email protected]<http://ar.mc576.mail.yahoo.com/mc/[email protected]>
> >* escribió:
>
>
> De: Cristian A. Lòpez 
> <[email protected]<http://ar.mc576.mail.yahoo.com/mc/[email protected]>
> >
> Asunto: [vbnet] Lectura de un puerto RS232
> Para: "vbnet List Member" 
> <[email protected]<http://ar.mc576.mail.yahoo.com/mc/[email protected]>
> >
> Fecha: martes, 7 de diciembre de 2010, 19:44
>
>  Salta el primer carácter, no lo leas, me parece la más fácil.
>
> Saludos.
>
> Cristian Lopez
>
>  *De:* 
> [email protected]<http://ar.mc576.mail.yahoo.com/mc/[email protected]>[mailto:
> [email protected]<http://ar.mc576.mail.yahoo.com/mc/[email protected]>]
> *En nombre de *Patricia Banfi
> *Enviado el:* Martes, 07 de Diciembre de 2010 14:17
> *Para:* vbnet List Member
> *Asunto:* [vbnet] Lectura de un puerto RS232
>
>    Encontré otras respuestas en el Spam.
>  Para no seguir complicando las cosas empecé de nuevo desde cero.
>  Ahora ví con readexisting traigo en un string lo que  necesito ( siempre
> que tenga el mensaje que muestra la longitud del buffer,si no trae de a 8).
> Cambié el mensaje por
>  Threading.Thread.Sleep(1000) (más por intuición que por conocimiento) y
> anda ok.
>
>  Ahora que solucioné lo más complicado me queda algo que debe ser simple:
>  el primer caracter del string que recibo es un valor hexadecimal y no sé
> cómo compararlo contra un char.
>
>  De nuevo gracias a todos.
>  Patricia
>
>
>
>
> --- El *mié 1-dic-10, Angel "Java" Lopez 
> <[email protected]<http://ar.mc576.mail.yahoo.com/mc/[email protected]>
> >* escribió:
>
>
> De: Angel "Java" Lopez 
> <[email protected]<http://ar.mc576.mail.yahoo.com/mc/[email protected]>
> >
> Asunto: [vbnet] Lectura de un puerto RS232
> Para: "vbnet List Member" 
> <[email protected]<http://ar.mc576.mail.yahoo.com/mc/[email protected]>
> >
> Fecha: miércoles, 1 de diciembre de 2010, 20:05
>
>  Hola gente!
> Hmm… intentaria revisar los parametros, y ver de manejar la puerta por
> eventos. Ejemplo simple:
>
>
>
> http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx
>
> Otro ejemplo, presentado en un enlace de:
> http://www.vbforums.com/showthread.php?t=530790
> http://www.vbforums.com/attachment.php?attachmentid=68715&d=1233255133
>
> Pero probaria con el primer ejemplo, parece mas simple.
>
> Nos leemos!
>
> Angel “Java” Lopez
> http://www.ajlopez.com
> http://twitter.com/ajlopez
>
>
>  *From:* 
> [email protected]<http://ar.mc576.mail.yahoo.com/mc/[email protected]>[mailto:
> [email protected]<http://ar.mc576.mail.yahoo.com/mc/[email protected]>]
> *On Behalf Of *Patricia Banfi
> *Sent:* Wednesday, December 01, 2010 5:29 PM
> *To:* vbnet List Member
> *Subject:* [vbnet] Lectura de un puerto RS232
>
>    Hola,
>
>  Trabajo con vb 2005 , estoy recibiendo datos por el puerto serial COM1
> con la siguiente sub (está hecha sólo para hacer pruebas de la interfase)
>  .....
>  AddHandler Puerto.DataReceived, AddressOf Recibir
>  ......
>
>  Private Sub Recibir(ByVal Sender As Object, ByVal e 
> AsIO.Ports.SerialDataReceivedEventArgs)
>  Dim RES As String
>  Dim mBuffer As Byte() = New Byte(Puerto.ReadBufferSize) {}
>  Try
>         Puerto.Read(mBuffer, 0, Puerto.ReadBufferSize)
>         If mBuffer(0) = Hex(5) Then
>            Me.mensa.Text = "EMPIEZA LA COMUNICACION"
>            MandarACK()
>         ElseIf mBuffer(0) = Hex(2) Then
>            Me.mensa.Text = "SE ESTAN COMUNICANDO"
>            MessageBox.Show(mBuffer.Length)
>            RES = System.Text.ASCIIEncoding.ASCII.GetString(mBuffer)
>            Me.txtRecibido.Text = RES
>            SW1.WriteLine(RES)
>            MandarACK()
>         ElseIf mBuffer(0) = Hex(4) Then
>            Me.mensa.Text = "TERMINÓ LA COMUNICACION"
>         Else
>            Me.mensa.Text = "recibió " & Convert.ToChar(mBuffer(0))
>  End If
>  Catch ex As Exception
>  MessageBox.Show(ex.ToString)
>  End Try
>  End Sub
>
>  La longitud del buffer es 4097, pero el getstring(mbuffer) me devuelve
> sólo 8 caracteres. Sé que recibo más de 8 porque probé con HyperTerminal.
> Probé con readexisting y no anduvo. Es la primera vez que trabajo con un
> RS232.
>
>  Alguna sugerencia ?
>  Muchas Gracias.
>  Patricia
>
>
>
>
>
>
>
>

Attachment: SerialPort.rar
Description: application/rar

Responder a