none
Crear un Objeto con un Evento, el evento llama metodos y el evento guarda informacion y la expone

    Pregunta

  • Hla Buenas tardes intento crear un Objeto que implementa esta interface que diseñe

    public interface IProximityTerminal
        {
            bool OnOff(string portName);
            string GetBadgetData();
    
            event SerialDataReceivedEventHandler  BadgeApproximate;
        }

    y la clase queda asi

    public class ProximityTerminal : IProximityTerminal
        {
            private SerialPort serialPort;
            private string portName;
            private bool statusConnection;
            private string badgetData;
    
            public ProximityTerminal()
            {
                this.serialPort = new SerialPort();
                this.portName = "";
                this.statusConnection = false;
                this.badgetData = "";
            }
    
            public bool OnOff(string portName)
            {
                this.portName = portName;
                this.serialPort.PortName = this.portName;
                try
                {
                    if (this.serialPort.IsOpen == true)
                    {
                        this.serialPort.Close();
                        this.serialPort.Dispose();
                        this.statusConnection = false;
                    }
                    else
                    {
                        this.serialPort.Open();
                        this.statusConnection = true;
                    }
                    return this.statusConnection;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
    
            public string GetBadgetData()
            {
                return this.badgetData;
            }
    
    
    
            public event SerialDataReceivedEventHandler BadgeApproximate;
    
            public virtual void OnBadgeApproximate(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                SerialDataReceivedEventHandler serialDataReceivedEventHandler = BadgeApproximate;
                if (serialDataReceivedEventHandler != null)
                {
                    this.badgetData = this.serialPort.ReadExisting();
                    //Todo el tratamiento para obtener el valor deseado
                }
            }
        }


    Lo que yo busco es que cuando se genero el evento desde un windows form por ejemplo y lea la tarjeta entre al metodo de la clase 

    OnBadgeApproximate

    y yo hay hacer mi chamba para regresar el valor que quiero no lo que da 

    this.serialPort.ReadExisting();

    y guardarlo en la variable 

    private string badgetData;

     para que ahora executar el metodo 

    GetBadgetData()

    y tenerlo listo,

    pero como que algo anda mal jajajaja.

    la idea es crear un windows form

    agregar mi objeto DE PROXIMIDAD

    que windows form este a la escucha del evento, NO ESTOY MUY SEGURO DE COMO HACERLO

    Y CUANDO PASE LA TARJETA SE ACTIVE EL EVENTO Y PODER OBTENER EL VALOR, 

    me podrian apoyar con este tema por favor

    jueves, 12 de julio de 2018 19:18

Respuestas

  • Series de 4 bytes = 32 bits

    Imaginate un código de "instalación" 29 (me gusta más la traducción de facility como dependencia/origen del otro valor), y el de tarjeta 61

    29 =  00011101 

    61 = 0000000000111101

    000111010000  ---> 4 unos, paridad par 0  (es par)

    000000111101  ---> 5 unos, paridad impar 0 (es impar)

    0 00011101 0000000000111101 0

    se trata de un rudimentario control de errores en el protocolo de transporte.

    Mirá, las dos pc que tengo a mano son de 64 bits y no tengo software de puerto virtual. Y el sdk, hasta donde yo sé, no lo trae. Así que no puedo testear lo que escribo.

    public virtual void OnBadgeApproximate(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
    	StringBuilder sb = new StringBuilder();
    	for (int k = 0; k < this.serialPort.BytesToRead; k++)
    	{
    		sb.AppendFormat("{0,3:X2}", this.serialPort.ReadByte());
    	}
    
    	this.badgetData = sb.ToString();
    
    	if (BadgeApproximate != null)
    	{
    		BadgeApproximate(this);
    	}
    }



    • Editado Walteг viernes, 13 de julio de 2018 19:25
    • Marcado como respuesta niqel hace 20 horas 18 minutos
    viernes, 13 de julio de 2018 19:23

Todas las respuestas

  • hola

    pero no veo que en ningun lado estes adjuntando el evento, falta las lineas del attach al evento y del raise que lo lance

    no veo donde invocas al OnBadgeApproximate, imagino deberia ser en el DataReceived del SerialPort

    si analizas el ejemplo

    Delegado EventHandler

    te falta lanzarlo

            public virtual void OnBadgeApproximate(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                SerialDataReceivedEventHandler serialDataReceivedEventHandler = BadgeApproximate;
                if (serialDataReceivedEventHandler != null)
                {
                    this.badgetData = this.serialPort.ReadExisting();
                    serialDataReceivedEventHandler(...);
                }
            }

    igual lo que veo raro es que uses el SerialDataReceivedEventHandler porque este es un evento de la clase de seria port, tu deberias crear tu propio handler y no utilizar el de otra clase

    entonces que el serial port lanza el DataReceived, lo capturas y de alli lanzas tu evento propio que defines

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 13 de julio de 2018 14:05
  • En línea con lo que ya te han respondido, podrías hacer esto

    public class ProximityTerminal : IProximityTerminal
    {
    	//...
    	
    	public ProximityTerminal()
    	{
    		//...
    		this.serialPort.DataReceived += OnBadgeApproximate;
    	}
    
    	//...
    
    	public event Action<ProximityTerminal> BadgeApproximate;
    
    	public virtual void OnBadgeApproximate(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    	{
    		this.badgetData = this.serialPort.ReadExisting();
    		
    		if (BadgeApproximate != null)
    		{
    			BadgeApproximate(this);
    		}
    	}
    }
    
    // el cliente, e.g., un Form1
    
    ProximityTerminal pt = new ProximityTerminal();
    
    pt.BadgeApproximate += Form1_BadgeApproximate;
    
    //...
    
    void Form1_BadgeApproximate(ProximityTerminal sender)
    {
    	textbox1.Text = sender.GetBadgetData();
    }

    No entiendo por qué recuperas los datos mediante ReadExisting, siendo que todo lo que esperas es un tren de 26 bits. Obviamente habría que ver si llegan empaquetados en 4 bytes, pero tendrías que leer los bytes uno por uno. Sus valores te pueden dar una pista de lo que traen y de cómo parsearlos.

    ---

    Realmente debería ser Action<IProximityTerminal>.

    • Editado Walteг viernes, 13 de julio de 2018 16:16
    viernes, 13 de julio de 2018 16:11
  • Walter

    No entiendo por qué recuperas los datos mediante ReadExisting, siendo que todo lo que esperas es un tren de 26 bits. Obviamente habría que ver si llegan empaquetados en 4 bytes, pero tendrías que leer los bytes uno por uno. Sus valores te pueden dar una pista de lo que traen y de cómo parsearlos.

    mira lo mas seguro es que si lleguen empaquetados en 4 bits, como hago para leerlo de esa manera

    no se que lineas de código poner.

    se supone que debo interpretarlo así.

    entonces necesito recibir el primer bit y ver si par, no se como hacerlo, necesito recibir los siguientes 8 bits, después solo quedan 16 que son el numero de tarjeta, que es el dato que me importa, y por ultimo necesitp otro bit de paridad al ultimo que sea impar

    como recibo los datos esa manera

    • Editado niqel viernes, 13 de julio de 2018 17:25
    viernes, 13 de julio de 2018 17:21
  • Series de 4 bytes = 32 bits

    Imaginate un código de "instalación" 29 (me gusta más la traducción de facility como dependencia/origen del otro valor), y el de tarjeta 61

    29 =  00011101 

    61 = 0000000000111101

    000111010000  ---> 4 unos, paridad par 0  (es par)

    000000111101  ---> 5 unos, paridad impar 0 (es impar)

    0 00011101 0000000000111101 0

    se trata de un rudimentario control de errores en el protocolo de transporte.

    Mirá, las dos pc que tengo a mano son de 64 bits y no tengo software de puerto virtual. Y el sdk, hasta donde yo sé, no lo trae. Así que no puedo testear lo que escribo.

    public virtual void OnBadgeApproximate(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
    	StringBuilder sb = new StringBuilder();
    	for (int k = 0; k < this.serialPort.BytesToRead; k++)
    	{
    		sb.AppendFormat("{0,3:X2}", this.serialPort.ReadByte());
    	}
    
    	this.badgetData = sb.ToString();
    
    	if (BadgeApproximate != null)
    	{
    		BadgeApproximate(this);
    	}
    }



    • Editado Walteг viernes, 13 de julio de 2018 19:25
    • Marcado como respuesta niqel hace 20 horas 18 minutos
    viernes, 13 de julio de 2018 19:23
  • Okey estoy emepzando hacer el codigo y probarlo

    pero una duda que no pusiste 

    el serialPort

    las propiedades parity, stopbits, databits como deberian ir, afectan en lo que u escribiste???

    viernes, 13 de julio de 2018 19:38
  • La paridad de la que hablamos, nada tiene que ver con el seteo del puerto serie.

    El seteo de la transmisión es otra cosa. La velocidad, paridad, detención y cantidad de bits de datos se pactan entre los extremos. Por ejemplo 9600/8N1: 9600 baudios, 8 bits de datos, sin paridad y 1 bit de parada.

    viernes, 13 de julio de 2018 19:51
  • ya lo probe, perdona que abuse de tu gentilidad, pero deberas me esta sayudando bastante no habia logrado nada, por favor dame el siguiete empujon

    mira con el codigo que me pusiste recibe este string 

    FF FF FF 55 02 FF 02 FF 00 0E 29 1A 00 me imagino que es hexadecimal y hay que transformalo a decimal

    utilice una pagina para convertirlo y me regreso esto en decimal

    070070 070070 070070 053053 048050 070070 048050 070070 048048 048069 050057 049065 048048

    la pagina fue esta

    https://www.branah.com/ascii-converter

    el numero del gafete que estoy scaneando, el numero impreso es este

    0014114885 215,24645

    tan cual lo puse como viene con el espacio y la coma, el objetivo es obtener esos numeros o por lo menos

    este 14114885 que es el me dicen que es el numero de gafete que aparece en el sistema de seguridad

    De antemano muchas gracias por tu apoyo

    viernes, 13 de julio de 2018 21:03