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
 




      

Responder a