Fijate que a la variable _buffer se accede desde dos lugares y, potencialmente, desde dos threads.
Un lugar/thread es el handler del evento de recepcion del puerto serie. El otro lugar/thread es el handler del timer. En todo lugar donde accedas a un recurso desde dos threads distintos, deberias bloquear el recurso para evitar el acceso simultaneo. Podes despreciar ese tema por el momento. Supongo que el lugar para enviar el ACK (o el NAK) seria el handler del timer, justo donde esta el Console.Writeline. ---------------------------------- Carlos Peix 2010/12/9 Patricia Banfi <[email protected]> > Huyyyy perdón ! No lo había visto ! > Voy a tratar de probarlo , pero me faltan algunos conceptos, no entiendo > dos cosas: > > 1. En la clase SerialPortBuffer, qué significa "bloquear" ? > > 2. Qué significa " enviar el ACK como parte de la interpretacion del > mensaje" ? Lo que estoy haciendo cuando leo el mensaje es calcular el > checksum y si coincide mando el ACK, si no mando NAK y me vuelve a mandar el > mensaje. > > Como ves, me tiré a la pileta sin saber nadar, pero es muy importante que > aprenda a hacer esto. De la misma manera pasé de Access sin SQL Server a > programar en vb .net y SQL Server. > Gracias !!!! > > > > --- El *jue 9-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: jueves, 9 de diciembre de 2010, 12:46 > > Hola Patricia, > > El tipo SerialPortBuffer es una clase que vas a encontrar en el archivo que > te envie. Respecto de tu orta pregunta del ACK, si, deberias enviar el ACK > como parte de la interpretacion del mensaje. > > ---------------------------------- > Carlos Peix > > 2010/12/9 Patricia Banfi > <[email protected]<http://ar.mc576.mail.yahoo.com/mc/[email protected]> > > > > Carlos, traté de probar el ejemplo que me mandaste pero no existe el > tipo SerialPortBuffer. > Estoy trabajando con vb 2005. > > > --- El *jue 9-dic-10, Carlos Peix > <[email protected]<http://ar.mc576.mail.yahoo.com/mc/[email protected]> > >* escribió: > > > De: Carlos Peix > <[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: jueves, 9 de diciembre de 2010, 7:32 > > 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]<http://ar.mc576.mail.yahoo.com/mc/[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]<http://ar.mc576.mail.yahoo.com/mc/[email protected]> > >* escribió: > > > De: Carlos Peix > <[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, 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 > > > > > > > > > > > > >
