El puerto Serie, como usarlo en WPF

Atendiendo el comentario de Jose Fco en el que indica :


<< He podido leer diversos ejemplos de como utilizar e implementar las funciones básicas de acceso al puerto serie principalmente en aplicaciones WinForms, seria posible obtener una esqueleto base en WPF tal como tienes para los anteriores.>>


El siguiente ejemplo, se entiende como ejercicio para realizar la transmisión y recepción de una trama utilizando un temporizador de un segundo en un proyecto WPF, para cerrar el circuito deberás insertar un conector en el puerto serie con un puente entre los pines 2 y 3. Recordad que el uso de ReadLine suspende la ejecucion del thread hasta recibir la sequencia definida en ‘SerialPort.NewLine’.


Partial Public Class Window1

    Delegate Sub Actualizar()     Private WithEvents Puerto1 As New System.IO.Ports.SerialPort     Private temporizador As New System.Timers.Timer     Private Recibidos As String = ""

    Sub New()         ' Llamada necesaria para el Diseñador de Windows Forms.          InitializeComponent()         Puerto1 = My.Computer.Ports.OpenSerialPort("COM1", 9600)         AddHandler Puerto1.DataReceived, AddressOf Recepcion         temporizador.Interval = 1000         temporizador.Enabled = True         AddHandler temporizador.Elapsed, AddressOf Peticion     End Sub
    Private Sub Recepcion()             Recibidos = Puerto1.ReadLine             Me.Dispatcher.Invoke(New Actualizar(AddressOf Datos))     End Sub
    Sub Peticion()             Puerto1.WriteLine("Saludos!")     End Sub
    Sub Datos()             Me.Label1.Content = Recibidos     End Sub End Class

Espero que cumpla con tus espectativas.
Saludos,
PepLluis,

Enviar un Hexadecimal al puerto serie, a partir de un entero en formato texto.

Es complicado poder atender todas las solicitudes recibidas en este blog, a menudo intento responder a vuestras inquietudes a pesar de que tambien siempre intento convenceros de que utilizemos los Foros de MSDN puesto que es el sitio adecuado para poder compartir vuestras preguntas para que todos los expertos puedan aportar su opinion.


Para preguntas sobre el puerto serie os recomiendo visitar : http://social.msdn.microsoft.com/Forums/es-ES/devcommes/threads


Una vez aclarado :-)
Bolivar pregunta : a luis tenia una consulta , como puedo convertir cualquier numero entero introducido en un textbox para despues convertirlo a hexadecimal y luego enviarlo por RS232


Repuesta:


    Private MiPuertoSerie As New IO.Ports.SerialPort
    Sub EnviarHex(Numero As String)
        Numero = Hex(Val(Numero)).ToString
        MiPuertoSerie.Write(Numero)
    End Sub

Como declarar el puerto serie de forma Global

Respondiendo una pregunta de los foros, me complace compartir con vosotros el siguiente ejercicio; no sin antes puntualizar que se trata de la puesta en escena de un ejemplo que utilizaría un modulo como “clase estática” donde depositar objetos compartidos dentro de nuestro espacio de aplicación.


Para evitar interpretaciones, este es uno de esos ejemplos que no debe considerarse “modelo” pues su escenario es poco menos que atípico, aclarar que en situaciones similares lo adecuado seria diseñar una clase completa con toda la funcionalidad y acceso, para posteriormente incluirla como propiedad en un modulo. La dificultad se encuentra en la cantidad de código que deberíamos desplegar para realizar una explicación que finalmente terminaría siendo compleja de seguir y entender.


Dicho esto, el siguiente es solo un punto de entrada para las personas que intentan iniciarse en el tema y se encuentran en situaciones como la que expone “Caudiz” en los foros… necesita poder acceder al puerto serie desde dos forms diferentes.


Primero definiríamos el modulo que contendrá toda la lógica de acceso al puerto serie y podría ser algo similar a lo que sigue :


Imports System.IO.Ports
 
Module SerialComm
 
    Private SerialPort1 As New SerialPort
    Private LastFrameRead As String
 
    Public Event DataAvailable()
 
    Sub New()
        SerialPort1.PortName = "COMx"
        SerialPort1.Open()
        AddHandler SerialPort1.DataReceived, AddressOf ReceiveData
    End Sub
 
    Private Sub ReceiveData()
        LastFrameRead += SerialPort1.ReadExisting.ToString()
        RaiseEvent DataAvailable()
    End Sub
 
    Public Function ReadData() As String
        Return LastFrameRead
    End Function
 
    Public Sub WriteData(Frame)
        SerialPort1.Write(Frame)
    End Sub
 
    Public Sub ClearData()
        LastFrameRead = ""
    End Sub
 
End Module

Finalmente incluiríamos el siguiente código para acceder a dicha funcionalidad en este caso desde el ‘Form1’ aunque evidentemente podemos incluirlo desde cualquier otro punto del espacio de nuestra aplicación.


Public Class Form1
 
    Sub Form1_Load(sender As System.Object, e As System.EventArgsHandles MyBase.Load
        AddHandler SerialComm.DataAvailable, AddressOf ReadData
        Form2.Show()
    End Sub
 
    Sub ReadData()
        Me.Label1.Text = SerialComm.ReadData
    End Sub
 
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgsHandles Button1.Click
        SerialComm.WriteData("Hola :-) from 1")
    End Sub
End Class

Public Class Form2
 
    Private Sub Form2_Load(sender As System.Object, e As System.EventArgsHandles MyBase.Load
        AddHandler SerialComm.DataAvailable, AddressOf ReadData
    End Sub
 
    Sub ReadData()
        Me.Label1.Text = SerialComm.ReadData
    End Sub
 
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgsHandles Button1.Click
        SerialComm.WriteData("Hola :-) from 2")
    End Sub
 
End Class

Espero vuestros comentarios y que a partir de esta idea, podáis construir de forma robusta la implementación de vuestra solucion.
Saludos,
PepLluis,

El servicio no autenticó al autor de la llamada.

Supongo que como “Tips and Tricks” por pregunta recurrente, cuando intentamos implementar un Servicio “WCF” en nuestro servidor, después de haberlo probado repetidamente en nuestro equipo de desarrollo sin ningún tipo de incidencia…

A tu PREGUNTA (Pablo):
Cuando intento conectarme al servicio desplegado en mi servidor, después de haber pasado las pruebas en nuestro entorno de desarrollo, recibo el siguiente mensaje : "El servicio no autenticó al autor de la llamada”, pero en mi caso no me interesa ningún tipo de autenticación para poder acceder al servicio, como debo configurar el cliente?.

La RESPUESTA:

A banda de que en este caso concreto no te interese implementar ningún tipo de autenticación es casi obligado que leas las recomendaciones sobre la arquitectura de seguridad para WCF en .NET Framework 4.0, este es el link : http://msdn.microsoft.com/es-es/library/ms788756.aspx

En tu caso el mensaje te esta indicando que tu servicio web esta implementando un “wsHttpBinding”, Si lo que te interesa es un acceso “Básico” para entendernos como con los antiguos “ws”, entonces debes editar el archivo de configuración del host “web.config” donde tengas instalado el servicio, y modificar del <System.ServiceModel> el <endpoint address="" binding="wsHttpBinding" contract="TusServicios.IService1"> por :

binding="basicHttpBinding" … con ‘b’ minúscula :-)

Luego es muy importante que actualices las referencias a tu servicio, pues en caso contrario el cliente se responderá con una excepción :

“No se pudo activar el servicio solicitado”… es obvio por la discordancia, desde el explorador de soluciones, click en el servicio y seleccionas la opción

- Actualizar referencia de Servicio

y Listo.

Saludos,
PepLluis,