GRACIAS CARLOS !!!! Con tu ejemplo y algo de perseverancia pude establecer la comunicación y mi cliente contento. Feliz año.
--- 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, 19:05 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]> 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]> 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, 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]> 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]> 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]> escribió: De: Cristian A. Lòpez <[email protected]> Asunto: [vbnet] Lectura de un puerto RS232 Para: "vbnet List Member" <[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] [mailto:[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]> escribió: De: Angel "Java" Lopez <[email protected]> Asunto: [vbnet] Lectura de un puerto RS232 Para: "vbnet List Member" <[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] [mailto:[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 As IO.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
