Colabora
 

Comunicación puerto serial

Con Visual Basic 2005

 

Fecha: 26/Sep/2007 (25-09-07)
Autor: Ruben Alexander More Valencia

 


Introducción

Gracias al Portal de ElGuille excelente Site para Programadores , miraba un ejemplo del uso de puertos serial , basicamente la programacion es facil , no es muy complicado mantener una comunicación entre puertos seriales ; el componente Serial Port de Visual Basic permite tener eventos y propiedades para manejarlos , intente hacer una aplicación sencilla pero cuando consultaba obtenia solo en mi computador el puerto COM1 , encontre el emulador Virtual Null Moden 2.5.0.8 que me permitio hacer esta prueba y alli va el ejercicio .

 

Primero configurar en el Virtual Null Modem dos puertos seriales conectados COM 2 – COM3 , creo que los electronicos entenderan que solo estoy programando y no haciendo un master de electronica…???? Bien por eso pero tal vez se ayuden con el inicio del hilo para aprender y programar cosas mucho mas complicadas…,prometo hacer algo mucho mas complicado

 

 

La Aplicación

En el Formulario hacer un ListBox(Name = lista) , un textbox(Multiline y Name=consola ) y un Button1 (Aquí se enviaran los mensajes entre COM2 y COM3)

Ademas de los componentes que no se ven en tiempo de diseño Serial Port (02 Compnentes Agreguen) estos tendran los siguientes nombres sp y sp3

 

 

Declaramos en el Form un Delegado ya veremos porque ??? este tendra como dato de referencia una variable data del tipo String

Public Class Form1
Delegate Sub delegado(ByVal data As String)

 

Al momento de cargar el formulario obtengo en la lista los puertos seriales que estan en mi computadora observen como se maneja esto : My.Computer.Ports.SerialPortNames

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
                Handles MyBase.Load
    For Each s As String In My.Computer.Ports.SerialPortNames
        lista.Items.Add(s)
    Next
End Sub

 

Bien ahora la aplicacion a la cual Uds. Le haran las mejoras correspondientes..empieza por asegurarse de que los puertos COM3 y aquel que seleccione de la lista esten cerrados y maneje en mensajes a la consola que se estan abriendo los puertosy .. porque el COM3? ..bueno porque en la configuracion en el Virtual Null este es el que recibira los datos, se vera entoces que para abrir y cerrar los puertos se usan los metodos Open() y Close(), recuerden utilizar Try Catch para manejar los errores que puedan ocurrir...

Private Sub lista_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) _
                Handles lista.SelectedIndexChanged
    Try
        sp3.Close()
        sp.Close()
        consola.AppendText("Puerto " & sp.PortName & " Cerrado" & vbCrLf)
        sp.PortName = lista.SelectedItem
        consola.AppendText("Abriendo Puerto : " & sp.PortName & vbCrLf)
        sp.Open()
        sp3.Open()
        consola.AppendText("Puerto : " & sp.PortName & " Abierto" & vbCrLf)
    Catch ex As Exception
        MessageBox.Show(ex.ToString, "", _
                MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
End Sub

 

Bien ahora enviaremos mensajes para ello en tiempo de ejecucion recuerden seleccionar el COM2 , porque ¿???.. bien porque es el que envia los datos y existe emulado la conexión entre el y el COM3 …si hacen la selección en el COM1 no comprobaran la aplicación (recuerden mejorarlo pes???!!)

Bien sp.NewLine = vbCrLf hace un salto de linea para los datos que se ecriben para enviarlos del puerto de envio

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
                Handles Button1.Click
    Try
        sp.NewLine = vbCrLf
        sp.WriteLine(Me.TextBox1.Text)
        consola.AppendText("Se ha enviado : " & Me.TextBox1.Text & vbCrLf)
    Catch ex As Exception
        MessageBox.Show(ex.ToString)
        consola.AppendText("Error al Enviar : " & ex.ToString)
    End Try
End Sub

En el COM3 (puerto sp3) en el evento DataReceived es el se mantiene esperando cualquier dato que llegue asi que programamos un mensaje que me permita “escuchar lo que entra por el COM3” Facil seria que como se manejan strings a una variable solamente se le asignara los datos de recepcion pero como Windows maneja un solo hilo en entorno gafico para mi textbox (Threads es una clase bastante facil entenderla despues de unas cuantas noches de insomnio jjajajaj) pero bueno solo les contare que hay que manejar un delegado para cambiar la posicion de memoria y que actue con otro hilo y no salten las benditas excepciones ¡!! Esto se hace creando un evento aparte que maneje los mensajes que envio al COM3 para que maneje otra seccion de memoria…

sp3.ReadExisting .. esto devuelve lo que recibe el puerto

Private Sub sp3_DataReceived(ByVal sender As Object, _
                ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
                Handles sp3.DataReceived
    Dim s As String = sp3.ReadExisting
    Dim escribeport3 As New delegado(AddressOf Me.mostar)
    Me.Invoke(escribeport3, s)
End Sub

Este es el evento para evitar la excepcion por subprocesos en los winforms

Sub mostar(ByVal d As String)
    consola.AppendText("El Puerto 3 Recibe : " & d)
End Sub

End Class

 

Atte Ing. Ruben Alexander More Valencia Universidad Alas Peruanas Piura Peru

 


Código de ejemplo (comprimido):

 

Fichero con el código de ejemplo: morev_comunicacion_puerto_serial.zip - 15.3 KB

(MD5 checksum: E1B5CF55D7DB9E5C15330ABEA45B8C24)

 


Ir al índice principal de el Guille