none
Problema puerto serial RRS feed

  • Pregunta

  • Saludos, es la primera pregunta que realizo espero que se entienda...

    Tengo un lector RFID conectado por el puerto serial y puedo capturar como string el identificador  de una tarjeta (tag) usando visual studio 2010, mi pregunta es:

    ¿Como hacer un ciclo infinito a medida que un TAG se acerque al lector, guardar ese identificador en una base de datos, en donde cada identificador se le asocia a un usuario?

    Adjunto código que estoy utilizando: 

     if (serialPort1.IsOpen)
                {
    
                    estado.Text = "Conectado";
                    buttonStart.Enabled = false;
                    buttonStop.Enabled = true;
                    textBox1.ReadOnly = false;
                    user.Enabled = true;
                    
                         
                    string message = serialPort1.ReadLine();
                    
                
                    textBox1.AppendText(message);
    
                    
                    
                    string message2 = serialPort1.ReadLine();
                    
                    textBox1.AppendText(message2);

    Yo capturo el dato del tag en message pero para un segundo tag en un message2, me gustaria hacerlo de forma infinita...

    Esperando una pronta y buena respuesta.

    sábado, 8 de junio de 2013 18:16

Respuestas

Todas las respuestas

  • Para hacer un bucle infinito simplemente debes hacer

     while(true)
     {....}


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    sábado, 8 de junio de 2013 19:21
    Moderador
  • hola

    pero porque no asocias el evento

    SerialPort.DataReceived Event

    entonces abres el puerto esperas a que se lance el evento que recepciona las lecturas

    dee sta forma no necesitas ningun ciclo

    Nota: tampoco usarias el serialPort1.ReadLine();, ya que esto lo recibes en el evento

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 8 de junio de 2013 19:59
  • Esa era mi próxima respuesta jejejeje no me he quedado agusto con lo infinito

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    sábado, 8 de junio de 2013 20:09
    Moderador
  • Si uso el evento que mencionas Leandro, es posible que esa misma lectura lo envie a una base de datos "creando" un registro?


    sábado, 8 de junio de 2013 20:15
  • Y para mostrarlo en un textBox, cada vez que el lector lee un identificador?
    sábado, 8 de junio de 2013 20:37
  • Fíjate en el ejemplo del enlace de Leandro,

    private static void DataReceivedHandler(
                            object sender,
                            SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
            Console.WriteLine("Data Received:");
            Console.Write(indata);
        }
    

    Este el el método que meneja dicho evento...la variable indata contiene los datos que se aun leído del puerto

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    sábado, 8 de junio de 2013 20:42
    Moderador
  • es posible que esa misma lectura lo envie a una base de datos "creando" un registro?

    claro esa es la idea, en ese evento tomas la lectura que recibes en el puerto

    depsues con esta haces lo que necesites, la registras, la muestras al usuario la escribes en un archivo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 8 de junio de 2013 21:09
  • Sergio, no puedo mostrar el string indata en un textBox.

    Saludos.

    sábado, 8 de junio de 2013 21:35
  • Que error te esta dando?? Como estad codificando lo que quieres hacer?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    sábado, 8 de junio de 2013 21:46
    Moderador
  • Es que agrego algo parecido a mi codigo, pero no puedo mostrar en un textBox el string indata en el FORM1...

    namespace serial
    
    {
    
        public partial class Form1 : Form
        {
                   
            public Form1()
            {
                InitializeComponent();
            }
    
            class PortDataReceived
            {
                public static void serial()
                {
    
                    SerialPort puertoserial = new SerialPort("COM9");
                    puertoserial.BaudRate = 9600;
                    puertoserial.Parity = Parity.None;
                    puertoserial.StopBits = StopBits.One;
                    puertoserial.DataBits = 8;
                    puertoserial.Handshake = Handshake.None;
    
                    puertoserial.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    
                    puertoserial.Open();
    
                    Console.WriteLine("Press any key to continue...");
                    Console.WriteLine();
                    Console.ReadKey();
                    puertoserial.Close();
                }
    
                private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
                {
    
                    SerialPort sp = (SerialPort)sender;
                    string indata = sp.ReadExisting();
                    Console.WriteLine("Data Received:");
                    Console.Write(indata);
                
                }
    
            }
    
    
            private void button1_Click(object sender, EventArgs e)
            {
                
                           
        }
    
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                
            }
        
    
    
    }
    }
    

    sábado, 8 de junio de 2013 22:20
  • pero se supone que no tienes que copiar y pegar todos lo que se muestre, deberias entender algo del codigo para adaptarlo

    para que usas el Console.WriteLine()

    en tu codigo si es una aplciacion winfor, eso solo aplica a desarollos de tipo consola

    por ejemplos esto

    Console.WriteLine("Press any key to continue...");

    esta de mas

    ademas defines esto

    class PortDataReceived
            {
                public static void serial()

    pero donde creas la instancia de PortDataRecive ? donde invocas el metodo serial ?

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 8 de junio de 2013 22:40
  • se supone que debs trabjar con los eventos del formularios

    public partial class Form1 : Form
    {
                   
    	public Form1()
    	{
    		InitializeComponent();
    	}
    	SerialPort puertoserial;
    
    	private void form1_Load(..)
    	{
    		puertoserial = new SerialPort("COM9");
    		puertoserial.BaudRate = 9600;
    		puertoserial.Parity = Parity.None;
    		puertoserial.StopBits = StopBits.One;
    		puertoserial.DataBits = 8;
    		puertoserial.Handshake = Handshake.None;
    
    		puertoserial.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    
    		puertoserial.Open();
    
    	}
    	
    	private void From1_Close(..)
    	{
    		puertoserial.Close();
    	}
    		
    	private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    	{
    		SerialPort sp = (SerialPort)sender;
    		string indata = sp.ReadExisting();
    		TextBox1.Text = indata;
    	
    	}
      
    }

    lo que acabo de pones no lo copies y pegues, sino que trata antes de entenderlo

    completa la definicion de los eventos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 8 de junio de 2013 22:41
  • Saludos

    Leandro no entiendo que hacen estas lineas: 

    public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
            {
                
                SerialPort serialport= (SerialPort)sender;
                string indata = serialport.ReadExisting();
                
                    
            }

    domingo, 9 de junio de 2013 0:34
  • estas recuperando la lectura que ingresa por el puerto serie

    el sender es el serialport que lanza la accion

    SerialPort.ReadExisting (Método)


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 9 de junio de 2013 2:07
  • Saludos.

    No he podido escribir en un textBox....

    Alguna ayudita?

    domingo, 9 de junio de 2013 7:18
  • Hola.

    ¿Pero cual es tu problema?,¿Por qué no puedes mostrar lo que recibes en el TexBox?, ¿Te da algún error?,¿No se escribe nada?. Leandro te lo ha escrito todo como tiene que ser. Lo único raro que veo es la configuración del puerto estas seguro que es Com9 muchos puertos serie para un ordenador.

    Pon un punto de interrupción y revisa lo que hay en indata
    private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    	{
    		SerialPort sp = (SerialPort)sender;
    		string indata = sp.ReadExisting();
    		TextBox1.Text = indata; // Punto de interrupción en esta linea
    	
    	}
    


    No hay problema bajo el Sol que no tenga solución. Nunca una noche ha vencido a un amanecer.

    domingo, 9 de junio de 2013 10:32
  • No he podido escribir en un textBox

    pero el decir solo eso no ayuda en nada, es mas ni siquiera te ayudas a ti mismo

    porque no comentas mejor que sucedio con la nueva implementacion


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 9 de junio de 2013 13:08
  • En esta línea me aparece el error:

       private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
            {
    
                SerialPort serialport = (SerialPort)sender;
                string indata = serialport.ReadExisting();
                textBox1.AppendText(indata); // En esta linea me marca el error cuando acerco la tarjeta.
    
                //Operación no válida a través de subprocesos: Se tuvo acceso al control 'textBox1' desde un subproceso distinto a aquel en que lo creó.
    
               
    
            }

    Saludos.

    domingo, 9 de junio de 2013 18:51
  • claro se deba a que ese evento se genera en un thread separado, no puedes acceder al textbox directo, habi olvidado ese punto

    Acceder a un control desde otro hilo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta LithiumCL domingo, 9 de junio de 2013 20:51
    domingo, 9 de junio de 2013 19:14
  • Muchas gracias por toda la ayuda me sirvió de mucho, está corriendo tal como esperaba.

    Agregué: Control.CheckForIllegalCrossThreadCalls = false;

    Gracias Leandro, Rodripelto, Sergio :)

    domingo, 9 de junio de 2013 20:53
  • Saludos.

             Agrego una nueva consulta que me aparece en el textBox...

     Lee el tag, pero me aparecen dos caracteres "extraños" al inicio y otro al final, el problema es que me hace un salto de linea (0A y 0D) y como le quiero agregar la hora / fecha (en otros dos textbox) me la escribe dos veces...

            ¿Como le puedo quitar todo los caracteres y el salto de linea para que me muestre en el textbox solo el tag?.

    Agrego codigo:

    SerialPort serialport = (SerialPort)sender;
                    string indata = serialport.ReadExisting();
    
    textBox1.AppendText(indata + "\n");
    
    string hora; 
                    hora = DateTime.Now.ToString("hh:mm:ss\n");
    textBox2.AppendText(hora + "\n");
    
    
    string fecha;
                    fecha = DateTime.Today.ToString("D");
    textBox3.AppendText(fecha + "\n");

    Esperando respuesta.

    miércoles, 12 de junio de 2013 21:00