Visual Basic - Puerto serie, bucle, mostrar y almacenar

Life is soft - evento anual de software empresarial
 
Vista:

Puerto serie, bucle, mostrar y almacenar

Publicado por Christian (2 intervenciones) el 19/01/2010 16:45:46
Buenas... estoy teniendo problemas con un programa, necesitaria que el programa envie una serie de cadenas por el puerto serial, capture la respuesta, la muestre y la guarde.
Tengo un problema q es cuando tomo la cadena leida del puerto serial y la muestro en la pantalla, la misma solamente tiene la longitud de 8 digitos, cuando toda la cadena tiene 15 caracteres, por lo cual me toma 2 ciclos. Con respecto a esto, hay posibilidad de hacerlo con 1 solo ciclo? que me lea los 15 digitos?
Ahora bien, esto lo dejo pasar y vuelvo a armar la cadena despues de los 2 ciclos. El inconveniente se me presente cuando yo tengo q enviar mas de una cadena, yo las envio mediante un bucle y solamente me muestra la recepcion de la respuesta una vez finalizado todo el envio (todo el bucle) y solamente es la primera respuesta la que me muestra. Trate dejando un sleep, pero tampoco hay caso.
Necesito que envie y reciba, todo el ciclo. Como seria esto posible? Te dejo el código que estoy utilizando para enviar una sola cadena, el problema es cuando en el archivo del envio "Envio.txt" tiene mas de una cadena...

Public Class Form1
Dim WithEvents serialPort As New IO.Ports.SerialPort
Dim cadeEnvi As String = ""
Dim cadeRecep As String = ""
Declare Sub Sleep Lib "kernel32" Alias "Sleep" _
(ByVal dwMilliseconds As Long)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
serialPort.PortName = "COM1"
serialPort.BaudRate = 4800
serialPort.Parity = IO.Ports.Parity.None
serialPort.StopBits = IO.Ports.StopBits.One
serialPort.Open()
serialPort.RtsEnable = True
End Sub
'Pausa... (Intenté esto ya que la respuesta puede tardar hasta 4 segundos como max)
Public Sub Sleep()
Sleep(4000)
End Sub
'Envio!!!
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
FileOpen(1, "Envio.txt", OpenMode.Input)
Do While Not EOF(1)
serialPort.RtsEnable = False
Try
Input(1, cadeEnvi)
serialPort.Write(cadeEnvi)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
serialPort.RtsEnable = True
Sleep()
Loop
FileClose(1)
End Sub
Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles serialPort.DataReceived
txtRecepcion.Invoke(New myDelegate(AddressOf updateTextBox), New Object() {})
End Sub
Public Delegate Sub myDelegate()
Public Sub updateTextBox()
FileOpen(2, "Base.txt", OpenMode.Append)
With txtRecepcion
.Font = New Font("Garamond", 12.0!, FontStyle.Bold)
.AppendText(serialPort.ReadExisting)
.ScrollToCaret()
cadeRecep = txtRecepcion.Text
WriteLine(2, cadeRecep)
End With
FileClose(2)
End Sub
End Class

Desde ya muchas gracias, cualquier duda si no se entendio algo te lo aclaro...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Puerto serie, bucle, mostrar y almacenar

Publicado por Marcela (2 intervenciones) el 20/01/2010 03:34:36
Le hice unas modificaciones, pero el problema sigue siendo el mismo...

Public Class Form1
Dim WithEvents serialPort As New IO.Ports.SerialPort
Dim cadeEnvi As String = ""
Dim cadeRecep As String = ""
Declare Sub Sleep Lib "kernel32" Alias "Sleep" _
(ByVal dwMilliseconds As Long)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
serialPort.PortName = "COM1"
serialPort.BaudRate = 4800
serialPort.Parity = IO.Ports.Parity.None
serialPort.DataBits = 8
serialPort.StopBits = IO.Ports.StopBits.One
serialPort.Open()
serialPort.RtsEnable = True
End Sub

Public Sub Sleep()
Sleep(150)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
FileOpen(1, "Parcial.txt", OpenMode.Input)
Do While Not EOF(1)
Input(1, cadeEnvi)
serialPort.RtsEnable = False
Try
serialPort.Write(cadeEnvi)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Sleep(150)
serialPort.RtsEnable = True
Sleep(1450)
Loop
FileClose(1)
txtEnvio.Focus()
End Sub

Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles serialPort.DataReceived
txtRecepcion.Invoke(New myDelegate(AddressOf updateTextBox), New Object() {})
End Sub

Public Delegate Sub myDelegate()

Public Sub updateTextBox()
With txtRecepcion
.Font = New Font("Garamond", 12.0!, FontStyle.Bold)
.AppendText(serialPort.ReadExisting)
.ScrollToCaret()
cadeRecep = txtRecepcion.Text
End With
End Sub

End Class
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar