Hola Carlos, Intenté hacer lo que me dijiste, pero 1.Nno tengo claro dónde tengo que definir la variable shared . 2. "Retirar el mensaje leido desde el buffer" sería limpiar la variable shared la matriz en la que recibe los datos ? Como ves, se me confunde el buffer (matriz) de puerto.read con la variable shared. Haciendo pruebas me dí cuenta de que con el mensaje que muestra el tamaño del buffer llego a ver más información recibida, pero si lo saco se comporta completamente diferente. Muchas gracias Patricia --- El mié 1-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, 1 de diciembre de 2010, 22:05 Una cosa mas, en el punto 1 dije "por ahora" y me olvide de aclarar el despues. Dato que potencialmente tengamos acceso concurrente al buffer, deberias sincronizar el acceso al mismo, una vez que tengas lo demas resuelto te ayudamos con esto ultimo. ---------------------------------- Carlos Peix 2010/12/1 Carlos Peix <[email protected]> Hola Patricia, Es normal que te pase lo que describis, deberias hacer las cosas de otra manera. No me animo a escribir codigo VB.NET asi que te planteo la idea. 1) Deberias crear un buffer, por ahora digamos que fuera una variable static (Shared en VB). 2) Deberias crear una funcion muy parecida a la que describis pero que agregue al buffer lo que recibe, NADA MAS! 3) Hacer otra funcion que se dispara periodicamente, por ejemplo con un timer, que analice el buffer y extraiga los mensajes de acuerdo a los caracteres de delimitacion. Por supuesto que esta funcion deberia retirar el mensaje leido desde el buffer. La idea es desacoplar la lectura del puerto del analisis del buffer. ---------------------------------- Carlos Peix 2010/12/1 Patricia Banfi <[email protected]> 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
