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

 

















 





 

 

 

 



      

Responder a