Colabora |
Comunicación puerto serialCon Visual Basic 2005
Fecha: 26/Sep/2007 (25-09-07)
|
IntroducciónGracias 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ónEn 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
|