• Viernes 8 de Noviembre de 2024, 19:58

Autor Tema:  Puerto serie, bucle, mostrar y almacenamiento de datos  (Leído 1043 veces)

Chiri85

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Puerto serie, bucle, mostrar y almacenamiento de datos
« en: Martes 19 de Enero de 2010, 16:58 »
0
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...

Chiri85

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Puerto serie, bucle, mostrar y almacenamiento de datos
« Respuesta #1 en: Miércoles 20 de Enero de 2010, 03:36 »
0
Le hice unas modificaciones...

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