Muchas Gracias Carlos, lo voy a intentar y después te cuento.

--- 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